[锁机制] 悲观锁、乐观锁及实现机制

乐观锁和悲观锁是进行数据库并发控制的两种思想,并非某种具体的锁机制实现。

乐观锁:适用于读操作多于写操作的场景。响应快。注意MySQL即默认采用乐观锁机制。

乐观锁在争用激烈的场景下,会产生大量空白的“自旋”(即多次操作失败重复尝试),导致性能大幅降低。

悲观锁:适用于写操作多于读操作的场景。

1.悲观锁

对数据进行修改时,首先对其加锁,再进行修改。对其他事务的操作进行排斥,其他线程需要访问数据时都将被阻塞挂起。

传统关系型数据库使用悲观锁,如行锁、表锁等。另外Java中的synchronized关键字也是悲观锁。

2.乐观锁

假设数据一般不会产生冲突,尽在数据进行更新提交的时候对检测进行冲突。也就是说尽量避免使用锁机制对数据对象进行限定,而是采用其他机制(如计数器、版本号等)来“岔开”事务间的读写竞争。

其实现方式如CAS(比较并交换 Compare And Swap)和版本号控制。

CAS举例:先获取目标数据的值,在写之前比较对方是否被修改过,违背修改则进行更新操作。

版本号控制举例:在版本号控制方式中,若需要对数据进行更新,在事务开始时获取版本号,在提交更新时比较当前版本号和刚才获取的版本号是否相同,若相同则提交更新,否则重试整个更新操作。

posted @ 2021-10-21 09:43  Cheung-10  阅读(6)  评论(0)    收藏  举报