<public class Account {
private int version;
....
public void setVersion(int version) {
this.version = version;
}
public int getVersion() {
return version;
}
....
}
<hibernate-mapping>
<class name="onlyfun.caterpillar.Account" talble="ACCOUNT"
optimistic-lock="version">
<id...../>
<version name="version" column="VERSION"/>
....
</class>
</hibernate-mapping>
public class Account {
private int version;
....
public void setVersion(int version) {
this.version = version;
}
public int getVersion() {
return version;
}
....
}
而在映像文g中,我们使用optimistic-lock属性设定version控制Q?lt;id>属性栏之后增加一?lt;version>标签Q例如:
<hibernate-mapping>
<class name="onlyfun.caterpillar.Account" talble="ACCOUNT"
optimistic-lock="version">
<id...../>
<version name="version" column="VERSION"/>
....
</class>
</hibernate-mapping>
讑֮好版本控制之后,在上例中如果B
客户试图更新数据Q将会引发StableObjectStateException例外Q我们可以捕捉这个例外,在处理中重新d数据库中的数据,同时?
B客户目前的数据与数据库中的数据秀出来Q让B客户有机会比对不一致的数据Q以军_要变更的部䆾Q或者您可以设计E?
式自动读取新的资料,q复扣ƾ业务流E,直到数据可以更新为止Q这一切可以在背景执行Q而不用让您的客户知道?br />
悲观锁定在多个客L可能d同一W数据或同时更新一W数据的情况下,必须要有讉K控制的手D,防止同一个数据被修改而造成混ؕQ最单的手段是Ҏ据进行锁定,在自p行数据读取或更新{动作时Q锁定其它客L不能对同一W数据进行Q何的动作?span lang="EN-US">
悲观锁定QPessimistic LockingQ一如其名称所C,悲观的认定每ơ资料存取时Q其它的客户端也会存取同一W数据,因此对该W数据进行锁定,直到自己操作完成后解除锁定?/span>
悲观锁定通常透过pȝ或数据库本n的功能来实现Q依赖系l或数据库本w提供的锁定机制Q?span lang="EN-US">Hibernatex如此Q我们可以利用Query或Criteria的setLockMode()Ҏ来设定要锁定的表或列QrowQ及光定模式,锁定模式有以下的几个Q?/span>