论坛首页 Java企业应用论坛

spring事务嵌套的疑惑

浏览 9437 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2014-03-25   最后修改:2014-03-25
描述:
public class UpdateService{

@Transactional(value = "transactionManager", propagation = Propagation.REQUIRED)
updateService(){
    updateService1();
    updateService2();
}
@Transactional(value = "transactionManager", propagation = Propagation.REQUIRES_NEW)
updateService1(){
    //some dao method
}
@Transactional(value = "transactionManager", propagation = Propagation.REQUIRES_NEW)
updateService2(){
    //some dao method
}
}

期望:updateService1(),结束,就更新数据库。
实际:都做完才更新数据库。
测试:在updateService1里,用flush,可以看到hibernate的sql,数据库还是没有更新。

最新测试:在mysql下按期望执行,oracle下有问题。担心数据库默认隔离界别不同,手动设置isolation="READ_COMMITTED",无效果。
配置文件,里 autocommit为false
 
 

 

   发表时间:2014-03-25   最后修改:2014-03-25
最新测试:在mysql下按期望执行,oracle下有问题。担心数据库默认隔离界别不同,手动设置isolation="READ_COMMITTED",无效果。
0 请登录后投票
   发表时间:2014-03-25  
再确认一下:事务配置是有效的。我测试了,在update事务配置上 read-only="true" 。会报错。以此确定,事务是应用上去的。
0 请登录后投票
   发表时间:2014-03-25   最后修改:2014-03-28
具体是需要知道亮点:
1 flush,为什么没有成功?
2 requires_new,有没有创建新的事务?(已解决)
0 请登录后投票
   发表时间:2014-03-26  
@jinnianshilongnian 请高手
0 请登录后投票
   发表时间:2014-03-26   最后修改:2014-03-26
你是通过this而调用updateService1,updateService2,不是通过spring的代理对象。不管你怎么改,他们俩用的还是updateService里启的事务。要让updateService1,updateService2定义的事务生效。可以通过 AopContext.currentProxy()获取代理对象,然后调用代理对象的方法。或者将updateService1,updateService2方法抽取到另外一个类里面。
1 请登录后投票
   发表时间:2014-03-26  
xoyozo123 写道
你是通过this而调用updateService1,updateService2,不是通过spring的代理对象。不管你怎么改,他们俩用的还是updateService里启的事务。要让updateService1,updateService2定义的事务生效。可以通过 AopContext.currentProxy()获取代理对象,然后调用代理对象的方法。或者将updateService1,updateService2方法抽取到另外一个类里面。


我试试这个。后天看有没有效果。会回复。
另一个疑问,为什么flush,mysql 有效果,而oracle 11g没有效果。兄弟有知道为什么不
0 请登录后投票
   发表时间:2014-03-26  
我怀疑mysql事务隔离级别实际是read-uncommited,既然你已经手动设置隔离级别为read-commited。那我也不知道原因是啥。
0 请登录后投票
   发表时间:2014-03-26  
iq527 写道
@jinnianshilongnian 请高手

+1
0 请登录后投票
   发表时间:2014-03-27  
xoyozo123 写道
你是通过this而调用updateService1,updateService2,不是通过spring的代理对象。不管你怎么改,他们俩用的还是updateService里启的事务。要让updateService1,updateService2定义的事务生效。可以通过 AopContext.currentProxy()获取代理对象,然后调用代理对象的方法。或者将updateService1,updateService2方法抽取到另外一个类里面。




正解!内部调用 没有经过Spring的切面!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics