乐观锁和悲观锁

乐观锁和悲观锁

乐观锁和悲观锁是在并发控制中常用的两种策略。

他们用于处理在多个进程同时访问共享资源时的情况。

悲观锁(Pessimistic Locking)

概念:悲观锁会假定发生并发冲突,所以在访问资源之前会获取锁,在使用期间保持锁定状态。

优点:悲观锁是一个有序队列,不存在冲突所以没有重试开销,可以处理并发冲突高的场景,保证了数据一致性和完整性。
缺点:悲观锁可能会导致队列堵塞、并发度偏低。

乐观锁(Optimistic Locking)

概念:乐观锁会假定不会发生并发冲突,所以在访问共享资源的时候不会立刻上锁,而是在执行更新操作时检查是否发生了冲突(检查数据是否发生了变动),如果发生了冲突,则重读数据重新执行更新操作。

那么乐观锁怎么知道是否发生了冲突呢,可以通过给记录加一个version字段来判断数据是否冲突。比如多个进程使用乐观锁操作同一个记录的amount字段时候,每个进程会先获取该记录的amount字段和version字段,然后执行业务操作,最后在写入的时候再获取一下verison字段,如果和之前一样则表示无冲突,则写入新的amount并更新version。如果version和之前不同,则回退并重新执行获取amount和version继续往下。

优点:任务不会堵塞,并发度高。
缺点:处理冲突的开销高。

总结

选择使用悲观锁还是乐观锁取决于应用场景和性能要求。

悲观锁适用于并发冲突概率较高的情况,保证数据的一致性和完整性。
而乐观锁适用于并发冲突概率较低的情况,可以提高系统的并发性能。

评论