一、场景:
我们在并发操作数据库同一个字段,比如:name:tom age:22这条数据。有2个同时进行操作。A操作该数据的name改成admin,B操作这条数据的age改成:35。然后A先把数据更新(name:admin age:22)到数据库。
然后B将他修改的数据(name:tom,age:35)更新数据库,这个时候数据库这条数据为:name:tom age:35 。而A的更新数据丢失。
这个就是数据更新丢失。
二、解决方法:
给表加一个乐观锁:
给javabean添加一个version属性。我们在并发更新数据的时候,hibernate会将用户更新的数据进行version对比,如果version不一致的话,用户更新失败,抛出异常。
三:
操作步骤:
1)给javvabean添加version属性:
属性名字可以随意不一定是version。
1 private Integer up; 2 public Integer getUp() { 3 return up; 4 } 5 6 public void setUp(Integer up) { 7 this.up = up; 8 }
映射文件添加version标签:(需要注意的是:version的位置,在property的前面。)
1 <version name="up"/>
这样更新数据操作的时候,会在数据库中多一个up属性(版本从0开始计算):
1 select *from customer; 2 +----+------+--------------+------+---------+----+ 3 | id | name | ipone_number | fav | version | up | 4 +----+------+--------------+------+---------+----+ 5 | 4 | ooop | 120 | NULL | NULL | 0 | 6 +----+------+--------------+------+---------+----+ 7 1 row in set (0.00 sec)
1 <version name="up"/>