我遇到了里这样的问题,还请各位高人解答一二service A{
   @Transactional(rollbackFor = Exception.class,isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRES_NEW) 
   method B(){
     dao1.deleteAll();
     ......
     dao1.save();   }
   @Transactional(rollbackFor = Exception.class,isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED)
   method C(){
       method B();
       dao1.select();
   }
}
这样在同一个service中,C方法调用B方法,但是C读到的数据还是deleteAll之前的数据,REQUIRES_NEW不是会开一个新的事务去执行独立自己的操作吗?为什么会出现这样的情况呢?springjava

解决方案 »

  1.   

    试试这样行不行:@Transactional(rollbackFor = Exception.class,isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED)    method C(){ 
           @Transactional(rollbackFor = Exception.class,isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRES
           method B();
           dao1.select();    

      

  2.   

    楼上的代码配置将B和C中的事务设置为同一个事务,C在调用完B之后,应该读不出deleteAll之前的数据。楼主的问题是将B的事务管理设为Propagation.REQUIRES_NEW,做为一个单独的事务来处理。当C调用完B时,数据被删除,并且已经提交了。这样C再去读应该读不到。但是C仍然读到了删除事前的数据。问题在于,当B被调用完,数据被删除后提交,数据库中数据确实被删除了。如果通过新开一个命令行查询会发现数据没有了。但是在C中调用查询,仍然还在。因为C有自己的事务管理。C的事务开启与调用C方法之时,此时表中的数据没有删除,为了保证数据的可重复读,在之后的查询中,都会以开启事务之时的数据为准,除非是有在当前事务中修改过。这与事务的隔离级别有关,楼主可以去了解相关的知识。下面的代码试试,应该查不出被删的数据
     @Transactional(rollbackFor = Exception.class,isolation=Isolation.ISOLATION_READ_COMMITTED,propagation=Propagation.REQUIRED)
       method C(){
           method B();
           dao1.select();
       }