Account ao1 = (Account) session1.load(Account.class, new Long(28));
Account ao2 = (Account) session2.load(Account.class, new Long(28));
如果Account ao2 = (Account) session2.load("Account", new Long(28))就出现不同步,只更新前一部分(ao1);
if(tx2 != null)
{
tx2.rollback(); //有同步数据库的作用
updateEntity2();
}
hibernate》hbm.xml设置:<property name="hibernate.connection.isolation">2</property>隔离级别
//测试乐观锁
Session session1=sf.openSession();
Session session2=sf.openSession();
Transaction tx1 = session1.beginTransaction();
Transaction tx2 = session2.beginTransaction();
try{
Account ao1 = (Account) session1.load(Account.class, new Long(28));
Account ao2 = (Account) session2.load(Account.class, new Long(28));
//这时候,两个版本号是相同的
ao1.setMoney(ao1.getMoney()+10);
tx1.commit();
//这时候,两个版本号是不相同的
ao2.setMoney(ao2.getMoney()+10);
tx2.commit();
System.out.println("OK!");
}catch(Exception e){
//System.out.println(e);
if(tx2 != null)//有同步数据库的作用
{
tx2.rollback();
updateEntity2();
}
else if(tx1 != null)//有同步数据库的作用
{
tx1.rollback();
updateEntity2();
}
void updateEntity2() {
//测试乐观锁
Session session1=sf.openSession();
Transaction tx1 = session1.beginTransaction();
try{
Account ao1 = (Account) session1.load(Account.class, new Long(28));
//这时候,两个版本号是不相同的
ao1.setMoney(ao1.getMoney()+10);
tx1.commit();
System.out.println("OK2!");
}catch(Exception e){
//System.out.println(e);
if(tx1 != null)//有同步数据库的作用
{
tx1.rollback();
updateEntity();
}
}finally{
session1.close();
}
}
本文通过具体示例探讨了在Hibernate环境下使用乐观锁机制进行并发控制的方法。文章演示了如何在多线程环境下通过版本号检查来避免数据冲突,并介绍了在不同事务中更新相同记录时可能出现的问题及解决策略。

1140

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



