首先我们要明白什么叫丢失更新。
比如数据库有一个person表,里面有一条这样的数据 "5 zhangsan shenzhen";
现在有两个事务A、B同时查找了这一条记录;
A事务修改记录为"5 zhangsan beijing";
提交事务
B事务修改记录为"5 lisi shenzhen";
这时候B事务再去提交或者回滚数据就会出现覆盖A事务已经修改的内容,这种情况就叫做丢失更新。
hibernate3中的解决方法:利用悲观锁、乐观锁
悲观锁:底层原理就是利用了数据库中的for update;
当数据库中select SQL语句上带有for update时,A事务能够查到信息,B在去查的时候就查不到信息,只有当A事务提交事务之后才能查到数据。
在hibernate3中在获取数据时有提供get(Class arg0,Serializable arg1,LockMode arg3)方法,可以在获取数据时给定一个LockMode参数(LockMode.UPGRADE)
一般不用,一般用乐观锁解决
乐观锁:
1.在实体类添加一个属性字段,假如名字叫ver,名字可以随意起,并提供getset方法
2.在对应的映射文件中添加<version name="ver"/>
其它就照常写就行了,在hibernate提交事务时发送的sql是这样子
update .... set ver=? .... where .... and version=?
意思是说在提交事务的时候,hibernate框架会自动检查两次的ver字段是否一致,如果不一致就不让进行更新,如果一致就进行更新
时间: 2024-10-08 03:48:17