mysql实现乐观锁和悲观锁该怎么编写?

TheDisguiser 2020-06-30 16:28:56 java常见问答 3952

乐观锁和悲观锁相信大家都是知道的,这是java中的基础知识,今天我们就来看看它们两者该如何使用代码实现吧。

乐观锁实现

1)、表设计

表task,分别有三个字段id,value、version

2)、具体实现

-首先读取task表中的数据,得到version的值为versionValue

-在每次更新task表value字段时,因为要防止可能发生的冲突,我们需要这样操作

select (value,version) from task where id=#{id}
update task
set value=newValue,version=versionValue+ 1
whereid=#{id} and version=versionValue;

只有当这条语句执行成功了,本次更新value字段的值才会表示成功

我们假设有两个节点A与B都需要更新task表中的value字段值,在相同时刻,A和B节点从task表中读到的version值都为2,那么A节点和B节点在更新value字段值的时候,都需要操作 update task set value = newValue,version = 3 where version = 2;

实际上其实只有1个节点执行该SQL语句成功,我们假设A节点执行成功,那么此时task表的version字段的值是3,B节点再操作update task set value = newValue,version = 3 where version = 2;这条SQL语句是不执行的,这样就保证了更新task表时不发生冲突

悲观锁实现

数据库中悲观锁实现,通常都是依靠的数据库锁机制。悲观锁原理:当我们在查询出goods信息后就把当前的数据锁定,直到我们修改完毕后再解锁。那么在这个过程中,因为goods被锁定了,就不会出现有第三者来对其进行修改了。

//使用悲观锁,我们必须要首先关闭mysql数据库的自动提交属性
set autocommit=0;
//设置完autocommit后,我们就可以执行我们的正常业务了。具体如下:
//1.开始事务
start transaction;
//2.查询出商品信息
select status from t_goods where id=1 for update;
//3.根据商品信息生成订单
insert into t_orders (id,goods_id) values (null,1);
//4.修改商品status为2
update t_goods set status=2;
//5.提交事务
commit;

以上就是今天的所有内容了,还想知道更多乐观锁与悲观锁等常见问题,就请持续关注本网站吧。

推荐阅读:

ReentrantLock属于乐观锁还是悲观锁?

乐观锁和悲观锁的区别有什么?有什么作用?

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