1. 如何支持this.sessionFactory.getCurrentSession()
在SessionFactory 的配置中
添加此配置后,必须在code中使用transaction
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同时相等,来确认内存中的两个对象相等。
在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同时相等,来确认内存中的两个对象相等。