您的位置:首页 > 其它

hibernate 锁:悲观锁、乐观锁

2013-11-03 17:14 337 查看
1.      锁:

Oracle:

悲观锁:

A事务:

    publicvoid testlock1(){
       Session session = HibernateUtil.getHibeSess();//获取会话
       Transaction ts = session.beginTransaction();
       Person p1 = (Person)session.get(Person.class,
"2c9282db421ca31501421ca3165d0001",LockMode.UPGRADE_NOWAIT);
       //UPGRADE_NOWAIT:其他事务不能获取该资源,并且抛出LockAcquisitionException异常
       //UPGRADE:其他事务等待当前事务释放资源
       System.out.println(p1.getName());
       p1.setName("张一");
       session.saveOrUpdate(p1);//假设断点停到此代码处
       ts.commit();
       HibernateUtil.closeHibeSess(session);
    }
B事务:

    publicvoid testlock2(){
       Session session = HibernateUtil.getHibeSess();//获取会话
       Transaction ts = session.beginTransaction();
       Person p1 = (Person)session.get(Person.class,
"2c9282db421ca31501421ca3165d0001",LockMode.UPGRADE_NOWAIT);//去拿资源时会抛出LockAcquisitionException异常
 
       System.out.println(p1.getName());
       p1.setName("张二");
       session.saveOrUpdate(p1);
       ts.commit();
       HibernateUtil.closeHibeSess(session);
    }

悲观锁:

A事务:

    publicvoid testlock1(){
       Session session = HibernateUtil.getHibeSess();//获取会话
       Transaction ts = session.beginTransaction();
       Person p1 = (Person)session.get(Person.class,
"2c9282db421ca31501421ca3165d0001",LockMode.UPGRADE);
       //UPGRADE:其他事务等待当前事务释放资源
       System.out.println(p1.getName());
       p1.setName("张一");
       session.saveOrUpdate(p1);//假设断点停到此代码处
       ts.commit();
       HibernateUtil.closeHibeSess(session);
    }
B事务:

    publicvoid testlock2(){
       Session session = HibernateUtil.getHibeSess();//获取会话
       Transaction ts = session.beginTransaction();
       Person p1 = (Person)session.get(Person.class,
"2c9282db421ca31501421ca3165d0001",LockMode.UPGRADE);//去拿资源时,会一直等待A事务释放资源。
       System.out.println(p1.getName());
       p1.setName("张二");
       session.saveOrUpdate(p1);
       ts.commit();
       HibernateUtil.closeHibeSess(session);
    }

乐观锁:
Person.java
publicclass
Person implements Serializable{
    private String
pno;
    private String
name;
    private String
address;
    private DepartmentEntity
dept;
    privateintage;
    privateintbbkz;//版本控制
  必须为int 
且不能为空
}
Person.hbm.xml:
<hibernate-mapping
>
    <class
name="com.etc.entity.singleface.Person"
table="t_happylock_person"

    lazy="false"
optimistic-lock="version"><!--
指定此实体采用版本号进行锁 -->
       <id
name="pno">
           <generator
class="uuid"/>
       </id>
       <version
name="bbkz"></version><!--
指定版本号存放列 -->
       <property
b04d

name="name"/>
       <property
name="address"/>
       <property
name="age"/>
       <many-to-one
name="dept"column="deptid"
cascade="save-update"fetch="join"
></many-to-one>
    </class>
</hibernate-mapping>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: