乐观锁问题

本文通过具体示例探讨了在Hibernate环境下使用乐观锁机制进行并发控制的方法。文章演示了如何在多线程环境下通过版本号检查来避免数据冲突,并介绍了在不同事务中更新相同记录时可能出现的问题及解决策略。

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();
  }
  
 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值