事务隔离READ UNCOMMITTED无法正常工作

时间:2017-08-29 09:37:50

标签: java spring hibernate transactions

我正在使用hibernate进行数据库连接。现在我需要读取未提交的事务隔离,但它对我不起作用。请有人帮我解释是什么原因,我使用过这段代码:

@org.springframework.transaction.annotation.Transactional( 
isolation =Isolation.READ_UNCOMMITTED)
 public addRank(){
//here i want to change status of rank corresponding rank id 1 so i called private mthoed addChangeStatus with id 1 
 addChangeStatus(1);
  //here i want to get rank with id and status true but i got null 
} 

private addChangeStatus( int rankId ){
  // first get rank entity from database using given id 
  Rank rank = dao.getRankById("query");
  //set status of rank true here
  rank.status(true);
}

在dao getRankById方法

Query getRankById(String query){
  //get currentSession from session factory 
   getCurrentSession().getNamedQuery(queryName);
}

任何人都可以告诉我,未提交的原因是什么原因无效。在xml文件中,我还将事务管理器配置为

<bean id="transactionManager"
    class="org.springframework.orm.hibernate5.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean> 

任何人都可以帮助我如何获得同一交易中的更新排名实体。

1 个答案:

答案 0 :(得分:2)

您无法在同一交易中测试READ_UNCOMMITTED

您尝试测试的内容不起作用,但原因不同。如果您尝试使用EntityManager#find()进行检索,则会从第一级缓存中获取结果,该结果将存储您尚未持久的更改,而不会进行数据库往返。第一级缓存无法通过查询工作。

所以:

  1. 如果您想在同一交易中存储和阅读,则不需要READ_UNCOMMITTED。只需将您的检索更改为EntityManger#find()Session#load()即可从第一级缓存中获取
  2. 如果确实需要READ_UNCOMMITTED修改涉及多笔交易的测试。