乐观锁 & 乐观锁 是一种设计思维,而不是锁的实现
在 Java 和 MySql 中,都有基于乐观锁和乐观锁的实现。Java 中的 atomic 包(CAS,基于乐观锁),synchronized(重量级锁,基于乐观锁);MySql 中的 lock in share mode 和 select for update;
乐观锁
认为对同一资源的并发操作不会总产生,属于小概率事件,不必每次都对数据上锁,也就是不采纳数据库本身的锁机制,而是通过程序来实现,能够通过版本号机制或者工夫戳机制实现。
例如在表中设计一个版本字段 version,第一次读的时候,会获取 version 字段的取值。而后对数据进行更新或删除操作时,会执行 UPDATE … SET version = version + 1 WHERE version = version。此时如果曾经有事务对这条数据进行了更改,批改就不会胜利。
乐观锁的工夫戳机制
工夫戳和版本号机制一样,也是在更新提交的时候,将以后数据的工夫戳和更新之前获得的工夫戳进行比拟,如果两者统一则更新胜利,否则就是版本抵触。
乐观锁
对数据被其余事务的批改持激进态度,会通过数据库本身的锁机制来实现,从而保证数据操作的排它性。
实用场景
乐观锁适宜读操作多的场景,相对来说写的操作比拟少。它的长处在于程序实现,不存在死锁问题,不过实用场景也会绝对乐观,因为它阻止不了除了程序以外的数据库操作。
乐观锁适宜写操作多的场景,因为写的操作具备排它性。采纳乐观锁的形式,能够在数据库层面阻止其余事务对该数据的操作权限,避免读 – 写和写 – 写的抵触。