Java蜘蛛人 欢迎大家

欢迎大家 来到我的blog , 如果我身边的朋友 有什么不懂可以直接来问我 我会细心的帮助你的. 如果网络上的朋友有什么不懂的 可以加我Java蜘蛛人 QQ48187537
posts - 54, comments - 192, trackbacks - 0, articles - 1

失误
悲观锁.
Acc acc=(Acc)session.get(Acc.class,new Long(1),LockMode.UPGRADE);   假如这个事物开始了 其他的失误不能访问的, 知道这个事物提交之后 然后再解锁
乐观锁
在建表时候 增加一个 version interger
然后再Acc.hbm.xml里
id  后面 添加
<version  name="version" column="VERSION"  />

注意 例子中 捕获StaleObjectStateException  这个异常
例子 

package com.zcq.dao2;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.StaleObjectStateException;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

 

public class Test extends Thread {
    public Test()
    {
        
    }
    
    private String tran;
    
    Configuration config
=new Configuration().configure();
    SessionFactory factory
=config.buildSessionFactory();
    Session     session
=factory.openSession();
   
    
    public Test(String tran)
    {
        this
.tran=tran;
    }
    
    
    
@Override
    public void run() {
        try {
             
if(tran.equals("tran"))
                 show();
             
else
                 show1();
            
        } catch (Exception e) {
            e
.printStackTrace();
            
// TODO: handle exception
        }
    
    }
    public void show()throws Exception
    { 
        Transaction tx
=null;
        try {
        
    
            tx
= session.beginTransaction();
            Thread
.sleep(500);
            
            Accounts accounts
=(Accounts)session.get(Accounts.class,new Long(1));
            Thread
.sleep(500);
            
            accounts
.setBalance(accounts.getBalance()+100);
            tx
.commit();
            Thread
.sleep(500);
                
        } catch (StaleObjectStateException e) {
            
if(tx!=null)
            {
              tx
.rollback();
            }
            e
.printStackTrace();
            
System.out.println("帐户被其他的事物修改.本事务撤销. 稍后在试..!");
        }
    }
    
    public void show1()throws Exception
    {
        Transaction tran
=null;
         try {
             tran
= session.beginTransaction();
             Thread
.sleep(500);
             Accounts accounts
=(Accounts)session.get(Accounts.class,new Long(1));
             
             Thread
.sleep(500);
             accounts
.setBalance(accounts.getBalance()-100);
             tran
.commit();
             Thread
.sleep(500);
        } catch (StaleObjectStateException e) {
            
if(tran!=null)
            {
                tran
.rollback();
            }
            e
.printStackTrace();
            
System.out.println("帐户被其他的事物修改.本事务撤销. 稍后在试..! show1");
            
// TODO: handle exception
        }
        
        
        
    }
    public void asd()
    {
        session
.beginTransaction();
        Accounts accounts
=new Accounts();
        accounts
.setName("zcq");
        accounts
.setBalance(1000.00);
        session
.save(accounts);
        
        session
.beginTransaction().commit();
    }
    
    public void closeSession()
    
    {
        
if(session!=null)
        {
            session
.close();
            session
=null;
        }
    }
    
    
    public static void main(String[] args) {
        
        Test aa
=new Test();
         
        
        Thread show
=new Test("tran");
        Thread show1
=new Test("tran2");
        
        show
.start();
        
        show1
.start();
        
        
       aa
.closeSession();
        
    }
}

Feedback

# re: Hibernate 悲观锁 and 乐观锁  回复  更多评论   

2008-05-15 20:49 by jdlsfl
不错

# re: Hibernate 悲观锁 and 乐观锁  回复  更多评论   

2008-11-28 19:55 by 月亮之上
很好,在处理并发业务的时候需要根据具体情况作出选择。

# re: Hibernate 悲观锁 and 乐观锁[未登录]  回复  更多评论   

2010-04-30 11:31 by 菜鸟
刚学不是很理解

只有注册用户登录后才能发表评论。


网站导航: