MVCC是乐观锁的一种实现方式,但并不是MVCC就等于乐观锁。乐观锁( Optimistic Locking)其实是一种思想。相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。
什么是MVCC?
英文全称为Multi-Version Concurrency Control,翻译为中文即多版本并发控制。MVCC使得InnoDB的事务隔离级别下执行一致性读操作有了保证,换言之,就是 为了查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值。这是一个可以用来增强并发性的强大的技术,因为这样一来的话查询就不用等 待另一个事务释放锁。这项技术在数据库领域并不是普遍使用的。一些其它的数据库产品,以及mysql其它的存储引擎并不支持它。
一般是在数据表中加上一个版本号version字段,表示数据被修改的次数,当数据被修改时,version值会加一。当线程A要更新数据值时,在读取数据的同时也会读取version值,在提交更新时,若刚才读到的version值与当前数据库中的version值相等时才更新,否则重试更新操作,直到更新成功。
mysq旳innodb表除了实际的数据之外,还会加上3个隐藏的字段,如下:
实际数据 | ||
create_no(创建版本号/创建时间) | update_no(每次修改的版本号/修改时间) | delete_no(删除版本号/删除时间) |
insert:当我们新增一条数据时,这条数据会加上创建的版本号
update:修改当前的字段,每修改一次数据,修改版本号都会依次增加一次
delete:删除当前的数据,其实并不会真实的删除,他会先在删除版本号字段记录下删除的版本号,在过了一段时间后会进行清除或者刷新
核心SQL代码:
update table set x=x+1, version=version+1 where id=#{id} and version=#{version};