论坛首页 Java版 Spring

spring事务管理之疑惑

浏览 4998 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (16) :: 隐藏帖 (0)
作者 正文
最后更新时间:2008-03-11
学习spring一点时间,有一个疑问一直萦绕心头,差了好多google没有解决困惑:

我使用spring的hibernateTemplate模板进行数据库的操作。也就是每个dao的方法都用这个template处理。如果我在配置中再使用了声明式事务管理来跨越dao的多个方法,比如我在service层进行声明式事务处理,该事务跨越了dao的两个方法method1和method2。

如果method1成功执行,而method2没有成功执行,那么事务时回滚到那个地方???

我想啊,既然method1使用了hibernateTemplate的方法,那么method1执行完后就是一个事务了,method2的失败不能回滚method1的执行结果吧?但是如果是这么解释,我在service层的事务声明不就是没有任何用处了吗?

困惑中。。。。
   
最后更新时间:2008-03-11
把method1,method2放在一个method,不行吗?
   
0 请登录后投票
最后更新时间:2008-03-11
有些情况下不好把他们放在同一个方法中。比如说:

一个Crud类有如下方法:
add(), update(), del(), find()

通常情况下这四个方法各用一个事务来处理。但是考虑这种情况下的业务逻辑:
记录的某个字段(设为字段A)是根据该记录的主键生成的,所以我要先插入一个记录获取主键,然后更新该记录的字段A

如上的情况是我必须把add()和update()作为一个事务处理。

当然上面只是一个特殊情况。归结为一般情况是: dao层有两个小事务t1和t2。而我在service层需要把t1和 t2合并成一个比较大的事务 T,我是想知道 T 在执行中已成功完成t1,但是t2异常,那么事务时回滚到什么程度?
   
0 请登录后投票
最后更新时间:2008-03-11
请注意,声明事务的位置是Service。而且,一般情况下,我们在一个Service中只使用一个事务。无论一个Service中有多少数据库操作,从始至终只有一个事务。即使是在Service中调用其他Service,一般也设定为如果已经有事务存在,那么被调用的Service自动加入这个事务。
Spring也提供了使用嵌套事务,大事务中套用小事务,小事务回滚,不直接造成大事务回滚。不过这个很少用。
   
0 请登录后投票
最后更新时间:2008-03-11
还是没明白需求,为什么不一次插入正确的值,而是先insert,后update。

可以看一下http://www.javaeye.com/topic/35907 嵌套事务
   
0 请登录后投票
最后更新时间:2008-03-11
或者

method3{
method1();
method2();
}
   
0 请登录后投票
最后更新时间:2008-03-11
可以搜索一下坛子,了解一下事务的嵌套和传播原理。当然,要明确自己事务范围的概念。
   
0 请登录后投票
最后更新时间:2008-03-11
魔力猫咪 写道
请注意,声明事务的位置是Service。而且,一般情况下,我们在一个Service中只使用一个事务。无论一个Service中有多少数据库操作,从始至终只有一个事务。即使是在Service中调用其他Service,一般也设定为如果已经有事务存在,那么被调用的Service自动加入这个事务。
Spring也提供了使用嵌套事务,大事务中套用小事务,小事务回滚,不直接造成大事务回滚。不过这个很少用。


第二方法失败的话都回滚,
因为2个方法是一个事务单位,同时commit,同时rollback
   
0 请登录后投票
最后更新时间:2008-03-11
e....................
事务没那么麻烦.....
建议重新想想事务的做法 和 什么是事务
   
0 请登录后投票
最后更新时间:2008-03-14
研究一下嵌套事务
   
0 请登录后投票
论坛首页 Java版 Spring

跳转论坛:
JavaEye推荐