网站开发开账务处理公司网站建设论文
2026/5/18 19:24:55 网站建设 项目流程
网站开发开账务处理,公司网站建设论文,网站开发的团队有哪些,网站页面下沉的特效代码一、MySQL进阶“当两个用户同时查看同一份数据#xff0c;你希望看到的是‘当前状态’#xff0c;还是‘事务开始时的状态’#xff1f;” —— MVCC#xff08;多版本并发控制#xff09;#xff0c;让数据库在高并发下依然保持“一致性”与“高效性”为什么需要MVCC你希望看到的是‘当前状态’还是‘事务开始时的状态’”—— MVCC多版本并发控制让数据库在高并发下依然保持“一致性”与“高效性”为什么需要MVCC——一场“读写冲突”的危机在传统数据库中读操作会阻塞写操作写操作会阻塞读操作。例如事务AUPDATE orders SET statusshipped WHERE order_id100事务BSELECT * FROM orders WHERE order_id100如果事务B在事务A未提交时执行会发生什么悲观锁事务B必须等待事务A提交锁表导致性能下降乐观锁事务B直接读取但可能读到未提交数据脏读2010年某电商网站因锁表问题导致双11期间响应时间从50ms飙升至500ms损失超百万这就是MVCC诞生的背景在不加锁的情况下实现高并发读写。1. InnoDB引擎-MVCC 什么是MVCCMVCCMulti-Version Concurrency Control是一种并发控制机制它通过保存数据的多个版本让读操作无需等待写操作从而实现“读不阻塞写写不阻塞读”。 两种读操作类型说明举例是否加锁当前读Current Read读取最新数据已提交SELECT ... FOR UPDATEUPDATEDELETE✅ 加锁X锁快照读Snapshot Read读取事务开始时的快照SELECT *❌ 不加锁关键点快照读是MVCC的核心它利用历史版本实现非阻塞读。MVCC的核心组件三个隐式字段InnoDB 通过三个隐藏字段在表中不可见实现MVCC字段作用类型说明DB_TRX_ID记录最近修改该行的事务ID6字节用于判断行是否对当前事务可见DB_ROLL_PTR指向Undo Log的指针7字节用于找到历史版本DB_ROW_ID隐藏的行ID自增6字节在索引中作为回表的唯一标为什么需要这些字段DB_TRX_ID判断行是否已提交DB_ROLL_PTR通过Undo Log找到旧版本DB_ROW_ID在索引中唯一标识行即使主键未指定Undo Log数据的“时间胶囊”Undo Log 是 MVCC 的基础它记录了数据修改前的旧值用于事务回滚MVCC 快照读 Undo Log 两种类型类型作用说明INSERT记录插入的行用于事务回滚删除时需恢复UPDATE记录修改前的旧值用于快照读和回滚更新时需恢复Undo Log 的存储由 InnoDB 的Undo Tablespace管理可以配置多个 Undo Log 文件MySQL 5.7 支持独立Undo表空间。数据版本链Undo Log 的“链式存储”当一行数据被多次修改时Undo Log 会形成版本链最新版本 → (DB_ROLL_PTR) → 旧版本 → (DB_ROLL_PTR) → 更旧版本 → ... → 初始版本举例初始balance1000事务1UPDATE balance800→ 生成Undo Log记录1000事务2UPDATE balance500→ 生成Undo Log记录800版本链500 → 800 → 1000ReadViewMVCC的“时间机器”ReadView是事务开始时生成的快照它决定了哪些版本对当前事务可见。 ReadView 包含的关键信息字段说明min_trx_id活跃事务最小ID当前正在执行的事务IDmax_trx_id活跃事务最大ID当前正在执行的事务ID上限m_ids活跃事务ID列表当前正在执行的事务ID集合def is_visible(trx_id, readview): if trx_id readview.min_trx_id: # 已提交 return True elif trx_id readview.max_trx_id: # 未提交 return False else: # 在活跃事务列表中 if trx_id in readview.m_ids: # 未提交 return False else: # 已提交 return True关键点RR级别可重复读事务开始时生成ReadView后续查询都使用同一ReadViewRC级别读已提交每次查询都生成新的ReadViewMVCC工作原理一次事务的“时间穿越”假设执行-- 事务AID100 START TRANSACTION; SELECT * FROM accounts WHERE user_id1; -- 快照读 UPDATE accounts SET balance500 WHERE user_id1; -- 当前读 COMMIT; -- 事务BID101 START TRANSACTION; SELECT * FROM accounts WHERE user_id1; -- 快照读 MVCC如何工作事务A开始生成ReadViewmin_trx_id100, max_trx_id102, m_ids[100]执行SELECT快照读使用ReadView判断可见性事务A执行UPDATE修改行生成Undo Log记录旧值1000 → 500DB_TRX_ID更新为100DB_ROLL_PTR指向Undo Log事务B执行SELECT生成ReadViewmin_trx_id101, max_trx_id102, m_ids[101]读取行DB_TRX_ID100 101→ 可见值为1000效果事务B在事务A未提交时读到的是1000事务A开始时的值而非500当前值。MVCC在不同隔离级别下的表现隔离级别快照读可见性规则幻读说明读未提交不使用MVCC直接读最新数据❌无MVCC读已提交使用MVCC每次查询生成新ReadView❌无法避免不可重复读可重复读使用MVCC事务开始时生成ReadView✅通过Next-Key Lock避免幻读串行化不使用MVCC强制加锁✅无MVCC为什么RR级别能避免幻读InnoDB 在RR级别下使用Next-Key Lock记录锁 间隙锁在读取时不仅锁住记录还锁住间隙防止其他事务插入新数据。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询