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的锁机制也更加灵活,能够满足不同应用场景的需求。