悲观锁
悲观锁,就是一种悲观心态的锁,每次访问数据时都会锁定数据:
乐观锁
乐观锁,就是一种乐观心态的锁,每次访问数据时并不锁定数据,期待数据并没作修改,如果数据没被修改则作具体的业务
应用程序上使用乐观锁的思想
MySQL的MVCC实现
多版本并发控制,MVCC
,Multi Version Concurrent Control
,用于实现非锁定的读操作。
MySQL的InnoDB的可重复读隔离级别中是通过在每条记录中加创建版本
和删除版本
两列来实现,这两列的值是事务的版本号。
- Insert操作,
创建版本
为当前事务ID - Delete操作,
删除版本
为当前事务ID - Update操作,原记录的
删除版本
为当前事务ID,新增一条更新后的记录的创建版本
为当前事务ID
数据的样式大概如下图:
如果需要查询某个事务版本的数据,逻辑如下SQL(只是用SQL表示此逻辑以便理解,内部并非这样实现):
select * from table where 创建版本 <= 当前版本 and (删除版本 is null or 删除版本 > 当前版本);