乐观锁和悲观锁的使用场景及应用

一、定义

1、乐观锁:顾名思义,对每次的数据操作都保持乐观的态度,不担心数据会被修改,所以不会对数据进行上锁。由于数据没有上锁,这就存在数据会被多人读写的情况。所以每次修改数据的时候需要对数据进行判断是否被修改过。

2、悲观锁:与乐观锁相反,对每次的数据操作都保存悲观的态度,总是担心数据会被修改,所以在自己操作的时候会对数据上锁,防止在自己操作的时候被他人同时操作导致更新丢失。

二、使用场景

1、乐观锁:由于乐观锁的不上锁特性,所以在性能方面要比悲观锁好,比较适合用在DB的读大于写的业务场景。

2、悲观锁:对于每一次数据修改都要上锁,如果在DB读取需要比较大的情况下有线程在执行数据修改操作会导致读操作全部被挂载起来,等修改线程释放了锁才能读到数据,体验极差。所以比较适合用在DB写大于读的情况。

三、实现

1、乐观锁:目前比较常用的有两种方式,第一种是使用版本号或者时间戳。在表中加个version或updatetime字段,在每次更新操作时对此一下该字段,如果一致则更新数据,数据不等则放弃本次修改,根据实际业务需求做相应的处理。第二种是CAS方式,即Java中的compareAndSwap。CAS操作涉及到三个操作数,内存值(valueOffSet)、期望值(expect)、更新值(update)。当内存值与期望值一致时就会更新数据,反之不操作。

2、悲观锁:

悲观锁的实现是依赖于数据库提供的锁机制,流程如下:

1.修改记录前,对记录加上排他锁(exclusive locking)

2.如果加锁失败,说明这条数据正在被修改,那么当前查询要等待或者抛出异常,这由开发者决定

3.如果加锁成功,可以对这条数据修改了,事务完成解锁

4.加锁修改期间,其他事务也想对这条记录进行操作时,都要等待或者直接抛出异常

发布了124 篇原创文章 · 获赞 76 · 访问量 5623

猜你喜欢

转载自blog.csdn.net/weixin_45151795/article/details/105585175