乐观锁和悲观锁相信大家都是知道的,这是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;
以上就是今天的所有内容了,还想知道更多乐观锁与悲观锁等常见问题,就请持续关注本网站吧。
推荐阅读: