Hibernate 中的锁

1. 如何支持this.sessionFactory.getCurrentSession()

在SessionFactory 的配置中

<property name="hibernateProperties">
<props>
<prop key="hibernate.current_session_context_class">
thred
</prop>
<prop key="hibernate.transaction.factory_class">
org.hibernate.transaction.JDBCTransactionFactory
</prop>
</props>
</property>

添加此配置后,必须在code中使用transaction

public List<LogEntry> getAll(){
Transaction transaction=this.sessionFactory.getCurrentSession().beginTransaction();
try{
return this.sessionFactory.getCurrentSession().createQuery("from LogEntry").list();
}finally{
transaction.commit();
}
}


public List<LogEntry> getByName(String name){
Transaction transaction=this.sessionFactory.getCurrentSession().beginTransaction();
try{
return this.sessionFactory.getCurrentSession().createQuery("from LogEntry where name=:name").setParameter

("name",name).uniqueResult();
}finally{
transaction.commit();
}
}

2. 线程A 和 B 各从数据库中加载同一行数据,线程A先更新数据,保存,然后线程B更新数据,这时就会有脏数据产生.

悲观锁: 线程A可以整行加锁,从而使得只有A更新完数据,B才能从数据库中加载数据,此方法为悲观锁

乐观锁: 如果执行的读操作比写操作多,最好将行释放,使用乐观锁.

3. hibernate中乐观锁的实现:
在数据库表中增加一列 : version, default value : null , long
在HIBERNATE的*.hbm.xml文件中

................
<version name="version" column="version" unsave-value="null" type="long"
<property name="name" column="name" not-null="true"/>
...............
每做一次更新,version 会自动加1, 这样当线程A更新完后, version=version+1, 线程再更新时 version 会不同,会有异常抛出

4. 可以通过比较对象ID和 VERSION同时相等,来确认内存中的两个对象相等。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值