mysql乐观锁总结和实践
                        
                            时间:2021-07-01 10:21:17
                            帮助过:4人阅读
							                        
                     
                    
                    
                    
 
那么为了使用乐观锁,我们首先修改t_goods表,增加一个version字段,数据默认version值为1。
t_goods表初始数据如下:
Sql代码
  
- mysql> select * from t_goods;  
 
- +
 
- | 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乐观锁总结和实践
标签: