当前位置: 首页 > 后端技术 > Java

乐观锁悲观锁

时间:2023-04-01 23:25:43 Java

乐观锁&悲观锁是一种设计思想,并不是锁的实现在Java和MySql中,都有基于乐观锁和悲观锁的实现。Java中的原子包(CAS,基于乐观锁)、synchronized(重量级锁,基于悲观锁);锁定共享模式并在MySql中选择更新;乐观锁认为对同一个资源的并发操作不会一直发生,属于小概率事件,不需要每次都对数据进行加锁,即不使用数据库本身的加锁机制,而是通过程序实现,可以通过版本号机制或者时间戳机制来实现。比如表中设计了一个version字段version,第一次读取时会获取version字段的值。然后在更新或删除数据时,会执行UPDATE...SETversion=version+1WHEREversion=version。此时如果已经有事务修改了这条数据,则修改不会成功。乐观锁的时间戳机制和版本号机制是一样的。提交更新时,将当前数据的时间戳与更新前获取的时间戳进行比较。如果两者一致则更新成功,否则为版本冲突。悲观锁对其他事务对数据的修改持保守态度,会通过数据库自身的锁机制来实现,从而保证数据操作的排他性。适用场景乐观锁适用于读操作较多,写操作相对较少的场景。它的优势在于程序的执行,不存在死锁问题,但是适用场景比较乐观,因为它不能阻止程序以外的数据库操作。悲观锁适用于写操作较多的场景,因为写操作是互斥的。使用悲观锁可以防止其他事务在数据库层面对数据进行操作,防止读写冲突。