2022-10-12 10:18:47
乐观锁与悲观锁概念和应用场景
一、乐观锁
乐观锁是一种设计思想,它认为对同一资源的并发操作不会总发生,属于小概率事件。因此,乐观锁不会每次都对数据上锁,而是不采用数据库自身的锁机制,而是通过程序逻辑来实现并发控制。
实现机制:
版本号机制:在表中设计一个版本字段(如version),每次读取数据时都会获取该版本字段的值。当对数据进行更新或删除操作时,会检查当前版本是否与读取时的版本一致,如果一致则进行更新(通常是版本号加1),否则更新失败。
时间戳机制:与版本号机制类似,时间戳机制在更新提交时,会将当前数据的时间戳与更新之前取得的时间戳进行比较,如果两者一致则更新成功,否则表示版本冲突。
应用场景:乐观锁适合读操作多、写操作少的场景。在这种场景下,由于并发冲突的概率较低,使用乐观锁可以减少锁的开销,提高系统的并发性能。同时,乐观锁的优点在于其实现依赖于程序逻辑,不存在死锁问题。然而,乐观锁无法阻止除了程序以外的数据库操作,因此其适用场景相对乐观。
二、悲观锁
悲观锁同样是一种设计思想,但它对数据被其他事务的修改持保守态度。悲观锁会通过数据库自身的锁机制来实现,以保证数据操作的排它性。
实现机制:悲观锁通常通过数据库提供的锁机制来实现,如MySQL中的LOCK IN SHARE MODE和SELECT FOR UPDATE语句。这些语句会在读取数据时对数据行加锁,以防止其他事务对该数据进行修改。
应用场景:悲观锁适合写操作多、读操作少的场景。在这种场景下,由于并发冲突的概率较高,使用悲观锁可以在数据库层面阻止其他事务对该数据的操作权限,从而防止读-写和写-写的冲突。虽然悲观锁会增加锁的开销和降低系统的并发性能,但在写操作频繁的场景下,它可以有效地保证数据的一致性和完整性。
总结: