【数据库】悲观锁与乐观锁与MySQL的MVCC实现简述

悲观锁

悲观锁,就是一种悲观心态的锁,每次访问数据时都会锁定数据:
mysql

乐观锁

乐观锁,就是一种乐观心态的锁,每次访问数据时并不锁定数据,期待数据并没做修改,若是数据没被修改则做具体的业务
sql

应用程序上使用乐观锁的思想

MySQL的MVCC实现

多版本并发控制,MVCCMulti Version Concurrent Control,用于实现非锁定的读操做。
MySQL的InnoDB的可重复读隔离级别中是经过在每条记录中加建立版本删除版本两列来实现,这两列的值是事务的版本号。并发

  • Insert操做,建立版本为当前事务ID
  • Delete操做,删除版本为当前事务ID
  • Update操做,原记录的删除版本为当前事务ID,新增一条更新后的记录的建立版本为当前事务ID
    数据的样式大概以下图:

若是须要查询某个事务版本的数据,逻辑以下SQL(只是用SQL表示此逻辑以便理解,内部并不是这样实现):mvc

select * from table where 建立版本 <= 当前版本 and (删除版本 is null or 删除版本 > 当前版本);

问题:可重复读中MVCC如何保证第1次查询和第2次查询的一致性?

相关文章
相关标签/搜索