论坛首页 Java企业应用论坛

spring事务嵌套的疑惑

浏览 9433 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2014-03-27  
xoyozo123 写道
我怀疑mysql事务隔离级别实际是read-uncommited,既然你已经手动设置隔离级别为read-commited。那我也不知道原因是啥。


我开始也是怀疑是数据库默认隔离级别不同。所以就测试了。
1  在spring中统一配置隔离级别:无效
2  把数据库中的隔离级别重新设置:无效(因为oracle就3级隔离级别,我就把mysql中的设置为read-commited。甚至设置为序列化的操作。任然有效.)
0 请登录后投票
   发表时间:2014-03-28  
lvwenwen 写道
iq527 写道
@jinnianshilongnian 请高手

+1


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


按照兄弟说的方法测试了。
没有去获取proxy,感觉这种方法会破坏spring的封装。
把子方法放到其他service中,调用(设置Propagation->REQUIRES_NEW)。可以更新。

开始没有用这种的原因是:感觉在service中调用另一个service中的方法,不怎么好。
anyway,问题找到了。by the way, 大家在层次调用的时候,有没有遵循什么规则。

我自己是觉得:同级不要互相调用,上级调用下级。
0 请登录后投票
   发表时间:2014-03-28  
xoyozo123 正解, spring的事务增强是通过动态代理来实现的, runtime, 除非使用aspectj之类的编译期增强框架, 在编译的时候就植入事务代码.
ps: 既然事务界定以service为边界, 尽量保持service的纯洁性, 但是这样为导致的大量代码重复的的肥service层, 考虑到后期维护, 可以参考ddd, 将业务逻辑代码抽象成领域对象, service负责组织领域对象
0 请登录后投票
   发表时间:2014-03-28  
0 请登录后投票
   发表时间:2014-03-28  
public void method(){
System.out.println("fdfd");
}
0 请登录后投票
   发表时间:2014-03-28  
liqiaomu410 写道
public void method(){
System.out.println("fdfd");
}


兄弟,你是猴子派来的?
0 请登录后投票
   发表时间:2014-03-28  
jinnianshilongnian 写道

 

多谢,已经浏览。闲暇会再看看你的博客。

0 请登录后投票
   发表时间:2014-03-28  
结贴 多谢大家。特别感谢 @xoyozo123 @lvwenwen  @iq527 @jinnianshilongnian
0 请登录后投票
论坛首页 Java企业应用版

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