|
精华帖 (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层的事务声明不就是没有任何用处了吗? 困惑中。。。。 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2008-03-11
把method1,method2放在一个method,不行吗?
|
|
| 返回顶楼 | |
|
最后更新时间:2008-03-11
有些情况下不好把他们放在同一个方法中。比如说:
一个Crud类有如下方法: add(), update(), del(), find() 通常情况下这四个方法各用一个事务来处理。但是考虑这种情况下的业务逻辑: 记录的某个字段(设为字段A)是根据该记录的主键生成的,所以我要先插入一个记录获取主键,然后更新该记录的字段A 如上的情况是我必须把add()和update()作为一个事务处理。 当然上面只是一个特殊情况。归结为一般情况是: dao层有两个小事务t1和t2。而我在service层需要把t1和 t2合并成一个比较大的事务 T,我是想知道 T 在执行中已成功完成t1,但是t2异常,那么事务时回滚到什么程度? |
|
| 返回顶楼 | |
|
最后更新时间:2008-03-11
请注意,声明事务的位置是Service。而且,一般情况下,我们在一个Service中只使用一个事务。无论一个Service中有多少数据库操作,从始至终只有一个事务。即使是在Service中调用其他Service,一般也设定为如果已经有事务存在,那么被调用的Service自动加入这个事务。
Spring也提供了使用嵌套事务,大事务中套用小事务,小事务回滚,不直接造成大事务回滚。不过这个很少用。 |
|
| 返回顶楼 | |
|
最后更新时间:2008-03-11
还是没明白需求,为什么不一次插入正确的值,而是先insert,后update。
可以看一下http://www.javaeye.com/topic/35907 嵌套事务 |
|
| 返回顶楼 | |
|
最后更新时间:2008-03-11
或者
method3{ method1(); method2(); } |
|
| 返回顶楼 | |
|
最后更新时间:2008-03-11
可以搜索一下坛子,了解一下事务的嵌套和传播原理。当然,要明确自己事务范围的概念。
|
|
| 返回顶楼 | |
|
最后更新时间:2008-03-11
魔力猫咪 写道 请注意,声明事务的位置是Service。而且,一般情况下,我们在一个Service中只使用一个事务。无论一个Service中有多少数据库操作,从始至终只有一个事务。即使是在Service中调用其他Service,一般也设定为如果已经有事务存在,那么被调用的Service自动加入这个事务。
Spring也提供了使用嵌套事务,大事务中套用小事务,小事务回滚,不直接造成大事务回滚。不过这个很少用。 第二方法失败的话都回滚, 因为2个方法是一个事务单位,同时commit,同时rollback |
|
| 返回顶楼 | |
|
最后更新时间:2008-03-11
e....................
事务没那么麻烦..... 建议重新想想事务的做法 和 什么是事务 |
|
| 返回顶楼 | |
|
最后更新时间:2008-03-14
研究一下嵌套事务
|
|
| 返回顶楼 | |









