乐观锁和悲观锁
一、乐观锁
认为对同一个数据的并发操作,不会造成冲突。在事务要提交更新的时候,才会对数据进行冲突校验。
第一次读的时候,获取到某个字段值,如版本或时间戳。处理完业务逻辑要开始更新的时候,需要再次查看这个字段是不是和第一次一样。如果一样就更新,反之拒绝。
可以使用数据版本记录机制或时间戳实现。
经典应用:共享文档,CAS,MVCC。
特点:并发度高,不会发生死锁。
二、悲观锁
具有强烈的独占和排他特性。认为并发操作一定会修改数据。所以在处理数据之前,要先对数据加锁,直到完成修改才释放锁。
比如MySQL默认可重复读隔离级别,使用悲观锁,要先关闭set_autocommit=0的自动提交属性。
使用lock in share mode 和 for update两种方式来实现select的读取锁。lock in share mode在一个事务要update同一个表单的时候,会很容易造成死锁。
for update有行锁和表锁。
特点:并发度小。
三、总结
悲观锁适合写操作非常多的场景,乐观锁适合读操作非常多的场景。

浙公网安备 33010602011771号