- xiayh04
- 等级:
- 性别:
- 文章: 57
- 积分: 180
- 来自: 上海
|
发表时间: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
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
返回顶楼 |
|
|
- xiayh04
- 等级:
- 性别:
- 文章: 57
- 积分: 180
- 来自: 上海
|
发表时间:2014-03-25
最后修改:2014-03-25
最新测试:在mysql下按期望执行,oracle下有问题。担心数据库默认隔离界别不同,手动设置isolation="READ_COMMITTED",无效果。
|
返回顶楼 |
|
|
- xiayh04
- 等级:
- 性别:
- 文章: 57
- 积分: 180
- 来自: 上海
|
再确认一下:事务配置是有效的。我测试了,在update事务配置上 read-only="true" 。会报错。以此确定,事务是应用上去的。
|
返回顶楼 |
|
|
- xiayh04
- 等级:
- 性别:
- 文章: 57
- 积分: 180
- 来自: 上海
|
发表时间:2014-03-25
最后修改:2014-03-28
具体是需要知道亮点:
1 flush,为什么没有成功?
2 requires_new,有没有创建新的事务?(已解决)
|
返回顶楼 |
|
|
- iq527
- 等级: 初级会员
- 性别:
- 文章: 45
- 积分: 30
- 来自: 杭州
|
@jinnianshilongnian 请高手
|
返回顶楼 |
|
|
- xoyozo123
- 等级: 初级会员
- 性别:
- 文章: 3
- 积分: 30
- 来自: 杭州
|
发表时间:2014-03-26
最后修改:2014-03-26
你是通过this而调用updateService1,updateService2,不是通过spring的代理对象。不管你怎么改,他们俩用的还是updateService里启的事务。要让updateService1,updateService2定义的事务生效。可以通过 AopContext.currentProxy()获取代理对象,然后调用代理对象的方法。或者将updateService1,updateService2方法抽取到另外一个类里面。
|
返回顶楼 |
|
|
- xiayh04
- 等级:
- 性别:
- 文章: 57
- 积分: 180
- 来自: 上海
|
xoyozo123 写道 你是通过this而调用updateService1,updateService2,不是通过spring的代理对象。不管你怎么改,他们俩用的还是updateService里启的事务。要让updateService1,updateService2定义的事务生效。可以通过 AopContext.currentProxy()获取代理对象,然后调用代理对象的方法。或者将updateService1,updateService2方法抽取到另外一个类里面。
我试试这个。后天看有没有效果。会回复。
另一个疑问,为什么flush,mysql 有效果,而oracle 11g没有效果。兄弟有知道为什么不
|
返回顶楼 |
|
|
- xoyozo123
- 等级: 初级会员
- 性别:
- 文章: 3
- 积分: 30
- 来自: 杭州
|
我怀疑mysql事务隔离级别实际是read-uncommited,既然你已经手动设置隔离级别为read-commited。那我也不知道原因是啥。
|
返回顶楼 |
|
|
- lvwenwen
- 等级: 初级会员
- 性别:
- 文章: 913
- 积分: 50
- 来自: 魔都
|
iq527 写道 @jinnianshilongnian 请高手
+1
|
返回顶楼 |
|
|
- 7454103
- 等级: 初级会员
- 性别:
- 文章: 136
- 积分: 20
- 来自: 西安
|
xoyozo123 写道 你是通过this而调用updateService1,updateService2,不是通过spring的代理对象。不管你怎么改,他们俩用的还是updateService里启的事务。要让updateService1,updateService2定义的事务生效。可以通过 AopContext.currentProxy()获取代理对象,然后调用代理对象的方法。或者将updateService1,updateService2方法抽取到另外一个类里面。
正解!内部调用 没有经过Spring的切面!
|
返回顶楼 |
|
|