1、使用version或者timestamp(推荐version,因为timestamp只能精确到秒,且必须保证数据库服务器的时间和应用程序的时间一致)。
2、如果APP是基于已有的数据库,而数据库表中不包含代表版本或时间戳的字段,hibernate提供了其他实现乐观锁的方法,把<class>元素的optimistic-lock属性设为"all":
<class name="Student" table="table" optimistic-lock="all" dynamic-update="true">
注意:如果把<class>元素的optimistic-lock属性设为all,或者"dirty",必须同时把"dynamic-update"属性设为"true".
hibernate会在update语句的where子句中包含Monkey对象被加载时的所有属性:
update student set count=1000 where id=1 and name="杨潇" and count=1000;
如果把<class>元素的optimistic-lock属性设为"dirty",并且dynamic-update属性设为true,那么在update语句的where子句中仅包含ID字段及被更新过的属性;
update student set count=1001 where id=1 and count=1001;
第二种方法比较慢,而且只适用于在一个Session中加载了对象,然后又在同一个Session中修改了这个持久化对象的场合。WHY?因为如果不在同一个SESSION中的话,如何得知在数据库中的属性呢?
本文介绍Hibernate框架中实现乐观锁的两种方法:一是通过version或timestamp字段;二是利用<class>元素的optimistic-lock属性设置为'all'或'dirty'来实现。这两种方式能够有效避免并发更新丢失的问题。
1075

被折叠的 条评论
为什么被折叠?



