一致性非锁定读
如果读取正在执行delete和update的数据时,不会等待锁的释放,而是会通过多版本控制机制读取行的一个快照版本
实现
通过undo段实现读取历史数据
undo段用于事务的数据回滚,所以没有本身的开销
条件
在Read Committed隔离级别下使用
读取锁定行最新的快照
在Repeatable Read隔离级别下使用
读取事务开始时的快照
一致性锁定读
Select ... for update
对读取行记录加X锁
Select ... lock in share mode
对读取行记录加S锁
自增长与锁
对于每个含有自增长的表都有一个计数器,每次插入数据时会获取计数器的值,并加锁插入,在插入完成后立即释放,不需要等待事务的完成
在InnoDB中自增长的列必须是索引,而且是索引的第一个列,不然会报错
锁的问题
幻读
在一次事务中两次读数据,第二次读到第一次中不存在的数据或者不一样的数据
丢失更新
一个事务的更新操作会被另一个事务覆盖
解决方法
使用Select ... for update(即加X锁)