MySQL-乐观锁
时间:2021-07-01 10:21:17
帮助过:4人阅读
+
| id | status | name | version |
+
| 1 | 1 | 道具 | 1 |
| 2 | 2 | 装备 | 2 |
+
2 rows in set
mysql>
对于乐观锁的实现,我使用MyBatis来进行实践,具体如下:
Goods实体类:
Java代码
- public class Goods implements Serializable {
-
-
- private static final long serialVersionUID = 6803791908148880587L;
-
-
- private int id;
-
-
- private int status;
-
-
- private String name;
-
-
- private int version;
-
- @Override
- public String toString(){
- return "good id:"+id+",goods status:"+status+",goods name:"+name+",goods version:"+version;
- }
-
-
-
- }
GoodsDao
Java代码
- int updateGoodsUseCAS(Goods goods);
mapper.xml
Xml代码
- <update id="updateGoodsUseCAS" parameterType="Goods">
- <![CDATA[
- update t_goods
- set status=#{status},name=#{name},version=version+1
- where id=#{id} and version=#{version}
- ]]>
- </update>
GoodsDaoTest测试类
Java代码
- @Test
- public void goodsDaoTest(){
- int goodsId = 1;
-
- Goods goods1 = this.goodsDao.getGoodsById(goodsId);
- Goods goods2 = this.goodsDao.getGoodsById(goodsId);
-
-
- System.out.println(goods1);
- System.out.println(goods2);
-
-
- goods1.setStatus(2);
- int updateResult1 = this.goodsDao.updateGoodsUseCAS(goods1);
- System.out.println("修改商品信息1"+(updateResult1==1?"成功":"失败"));
-
-
- goods1.setStatus(2);
- int updateResult2 = this.goodsDao.updateGoodsUseCAS(goods1);
- System.out.println("修改商品信息2"+(updateResult2==1?"成功":"失败"));
- }
输出结果:
Shell代码
- good id:1,goods status:1,goods name:道具,goods version:1
- good id:1,goods status:1,goods name:道具,goods version:1
- 修改商品信息1成功
- 修改商品信息2失败
说明:
在GoodsDaoTest测试方法中,我们同时查出同一个版本的数据,赋给不同的goods对象,然后先修改good1对象然后执行更新操作,执行成功。然后我们修改goods2,执行更新操作时提示操作失败。此时t_goods表中数据如下:
Sql代码
- mysql> select * from t_goods;
- +
- | id | status | name | version |
- +
- | 1 | 2 | 道具 | 2 |
- | 2 | 2 | 装备 | 2 |
- +
- 2 rows in set
-
- mysql>
我们可以看到 id为1的数据version已经在第一次更新时修改为2了。所以我们更新good2时update where条件已经不匹配了,所以更新不会成功,具体sql如下:
Sql代码
- update t_goods
- set status=2,version=version+1
- where id=#{id} and version=#{version};
这样我们就实现了乐观锁
MySQL-乐观锁
标签:版本号 lock string mes title comment fda 生成 tools