首页 >

mysql底层如何实现锁 |linux mysql 字符集问题

mysql 与 sql,云MySQL的优势,php遍历mysql的表,mysql删除数据优化,mysql脚本批量提交,linux mysql 字符集问题mysql底层如何实现锁 |linux mysql 字符集问题

MySQL使用两种锁机制:共享锁(S锁)和排他锁(X锁)。S锁表示读锁,X锁表示写锁。S锁允许其他事务获取S锁,但不能获取X锁,而X锁既不能被其他事务获取S锁,也不能被获取X锁。

//加锁示例
SELECT * FROM table WHERE id=1 LOCK IN SHARE MODE; //获取共享锁
SELECT * FROM table WHERE id=1 FOR UPDATE; //获取排他锁

InnoDB存储引擎采用多版本并发控制(MVCC)的机制,可以同时支持读取和写入操作,但需要特别注意底层细节。下面介绍一下MVCC机制的原理。

InnoDB引擎的每一行记录都存在一个隐藏字段 —— DB_TRX_ID,它用于记录当前行最近一次被修改的事务ID。同时,InnoDB维护一个长度为6的数组 —— DB_ROLL_PTR,指向支持当前行多个版本的Undo日志的指针。

读取操作时,数据库内部根据DB_TRX_ID和当前事务的视图版本号来判断当前行是否可见。如果当前行最近被修改的事务ID小于当前事务的起始版本或大于等于当前事务的事务ID,则该行对当前事务不可见。

写入操作时,InnoDB会根据需要自动为该行创建一个Undo日志,这个Undo日志会在之后的事务回滚时反向执行,把数据恢复到修改之前的状态。事务提交时,InnoDB会为该事务中的修改创建一个存储在磁盘上的Redo日志。该日志记录着数据库从修改前的状态到修改后的状态的所有变化,可以用于在崩溃恢复时恢复修改操作。

由此看来,InnoDB采用MVCC机制进行并发控制有着良好的性能表现。同时,InnoDB的锁机制也更加灵活,能够满足不同应用场景的需求。


  • 暂无相关文章