乐观锁实现方式有几种?乐观锁是什么?

TheDisguiser 2020-05-18 22:04:03 java常见问答 6194

在解决数据库性能开销过大的各种方式中,乐观锁是一种不错的方式,那你们知道乐观锁是什么吗?它一般有几种实现方式呢?跟小编一起了解了解吧。

一、什么是乐观锁?

乐观锁是相对悲观锁而言的,乐观锁机制下会假设数据一般情况下不会造成冲突,所以数据已经在进行提交更新的时候,乐观锁才会正式对数据的冲突与否进行检测,如果发现冲突,就会返回给用户错误的信息,让用户自己决定如何去做。

乐观锁采取了更加宽松的加锁机制。因为它是相对悲观锁而言的,这也是为了避免可能的数据库幻读、业务处理时间过长等等原因而引起数据处理错误的一种机制,但乐观锁一般不会去刻意使用数据库本身的锁机制,它会依赖数据本身来保证数据的正确性。

乐观锁它相信事务之间的数据竞争的概率是比较小的,因此它会尽可能的直接做下去,直到提交的时候才去锁定,所以不会产生任何锁和死锁

乐观锁实现方式有几种

二、乐观锁一般有哪些实现方式?

1.版本号机制

一般是说在数据表中加上一个数据库版本号version字段,在表述数据被修改的次数当数据被修改时,它的version 值会加1。

如:

当然线程A需要更新数据值时,在读取数据的同时也会读取 version 值,在提交更新时,若刚才读取到的 version 值为当前数据库中的 version 值相等时才更新,否则重试更新操作,直到更新成功。

2.CAS 算法

CAS(compare and swap) 比较并交换,有三个操作数,内存地址V ,预期值B,要替换得到的目标子A;

CAS指令执行时,比较内存地址V与预期值B是否相等,若相等则将A赋给B,(不相等则会循环比较直到相等)整个比较赋值操作是一个原子操作;

CAS缺点:

1.循环时间开销大:当内存地址V与预期值B不相等时会一直循环比较直到相等,

2.只能保证一个共享变量的原子操作,

3.如果一个变量V初次读取的时候是A值,并且在准备赋值的时候检查到它仍然是A值,那么我们就能说明它的值没有被其他线程修改过吗?很明显不是,因为在这段时间内它的值可能被改为其他值,然后又被改回A,那CAS操作就会认为它从来没被改过,这个问题j就被称为 CAS 操作的“ABA” 问题。

以上就是今天的全部内容了,如果想了解更多乐观锁及java常见问答的一些知识,请关注我们的网站了解详情吧。

推荐阅读:

Java中实现锁的方式有哪些?详细介绍

死锁产生的场景都有哪些?死锁产生的条件是什么?

乐观锁是什么?怎么实现乐观锁?