Hibernate事务处理的悲观锁和乐观锁

来源:互联网 发布:windows 音量 编辑:程序博客网 时间:2024/05/22 03:32

为了考虑并发的效率,把hibernate.connection.isolation设置为2,同时还要解决重复读和幻读的问题。

悲观锁:(需要依赖于数据库的锁),悲观锁的思想是:每次执行一个事务,这个事务都认为一定会有其它的事务来干扰自己。所以悲观锁的做法是,不管有没有事务将要来干扰自己,一上来就将自己需要操作的东西加上锁,直到自己操作完了才让别的事务操作。这种设计的缺点是效率降低。

    select

        account0_.id as id0_0_,

        account0_.balance as balance0_0_

    from

        Account account0_

    where

        account0_.id=? for update

load(xx.class,I,LockMode.UPGRADE)

LockMode.None:无锁模式,tansaction结束时自动切换到此模式

LockMode.read:在查询时Hibernate会自动获取锁

 


LockMode.write insert update会自动获取锁

 

    @Test

    public void testAddLock(){

       Session session=sf.getCurrentSession();

       session.beginTransaction();

        Account a=(Account) session.load(Account.class, 2,LockMode.UPGRADE);

        int balance=a.getBalance()-100;

        a.setBalance(balance);       

       session.getTransaction().commit();

    }

 

 

乐观锁:(不依赖与数据库的锁,比悲观锁的效率高),乐观锁的思想是:每次执行一个事务,这个事务乐观的认为不会有其它的事务来干扰自己。只是在操作的东西上加上一个版本号,操作结束和比较一下操作前的版本号,如果一致说明没有被其它事务干扰,否则就被其它事务所干扰。当发现版本不一致时,采取相应的操作。

    @Test

    public void testAddLock1(){

       Session session=sf.openSession();

       Session session1=sf.openSession();

       session.beginTransaction();

        Account a=(Account) session.load(Account.class, 1);

        a.setBalance(900);

        session1.beginTransaction();

        Account a1=(Account) session1.load(Account.class, 1);

        a1.setBalance(1100);

        session.getTransaction().commit();

        System.out.println("the vesion :"+a.getVersion());

       session1.getTransaction().commit();

       System.out.println("the vesion :"+a1.getVersion());

       session.close();

       session1.close();

      

}

 

 

 

 

原创粉丝点击