关于Spring事务控制的困扰,高手请进!

keel47 2007-09-07 09:57:10
关于Spring的事务控制有个一直想不明白的地方,那就是事制范围的控制.按照spring自己提供的simple以及网上能找到的例子.大家似乎都在用一个Service接口+TransactionTemplate的模式来管理事务.这样,一个事务以Service为进行单位划分.
但是,如果在一个Controller里,需要调用2-3个Service时,这些Service之间的事务能够整合成一个整体吗?根据当前项目中出现的问题,发现spring控制的不是很好.每个Service调用结束后都会提交自己的事务,将数据保存到数据库,其他Service即使发生了异常,也无法回滚前一个Service的事务.(虽说理想状态下,一个Controller里只有一个Service的调用,但是理想终归是理想....)
所以,请问大家,Spring中有没有将事务控制在一次会话提交的范围内的办法?也就是说,希望用户点击一个按钮后直到结果页面出现,这个过程中任何异常都能保证事务完整回滚,这样的事务管理方式大家后没有用过呢?如果有好的办法,希望能和我们分享一下,高分赐教!
当前项目的状态: spring1.2.8 + hibernate3.0
为了对应Hiberante,已经备置了OpenSessionInViewFilter.
由于多个模块并行开发,经常出现一个Controller中调用多个模块的Service的现象.
...全文
2742 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
janwin 2010-12-28
  • 打赏
  • 举报
回复
这个不错,学到点东西了
chengluwu 2010-04-26
  • 打赏
  • 举报
回复
刚刚的项目中,要用到事务,高手帮忙.....
ZhlIsJacky 2008-11-03
  • 打赏
  • 举报
回复
建议在service控制事务
keel47 2007-09-21
  • 打赏
  • 举报
回复
NND,公司这几天封网,害的发分晚了好几天,抱歉了.
楼上的几位所言极是,spring的事务应该在Service层处理.
但本项目特殊,是一个移植性质的项目,而且现阶段无法做到和Spring100%的代码兼容.
为了程序运行正常,许多地方得借鉴老项目的实现方式,比如事务控制,所以才出现了问题.
amazeur 2007-09-14
  • 打赏
  • 举报
回复
up
chenyumao 2007-09-14
  • 打赏
  • 举报
回复
楼上的全忽悠,SPRING的事务可以嵌套,并设置嵌套的时候的机制。所以其他一切全没问题,只要配置好就行了,根本没有“那你可以写一个service,在这个service中调用其他几个service”这个说法
Saro 2007-09-14
  • 打赏
  • 举报
回复
事务的边界应该到service就够了,cotroller只该起到转换数据,控制页面流的作用。如果将业务逻辑放到了controller中,那你的单元测试将会很麻烦的。
dllgdx2000 2007-09-14
  • 打赏
  • 举报
回复
接分
chengang_1981 2007-09-13
  • 打赏
  • 举报
回复
那你可以写一个service,在这个service中调用其他几个service.
jingtao8177 2007-09-13
  • 打赏
  • 举报
回复
up
idilent 2007-09-12
  • 打赏
  • 举报
回复
什么情况下会遇到一个controller调用几个service,而这些service应该一起commit和rollback呢?个人觉得这样的逻辑完全可以用一个controller调用一个service来实现。
吐司vivi 2007-09-12
  • 打赏
  • 举报
回复
hh 学习了
TNT_abc 2007-09-11
  • 打赏
  • 举报
回复
初学者,共同探讨,刚刚涉及spring事务,不太了解具体细节spring的事务传播规则不是定义事务的传播行为的吗,不是可以把一个刚刚开始的事务定义到正在运行的事务当中吗,楼主是不是可以考虑一下,我认为spring应该可以解决这个问题,只不过我还不是很清楚罢了。共勉!!
keel47 2007-09-11
  • 打赏
  • 举报
回复
To zjf405(On№The①Road) 非常感谢你的提示,这是一个很不错的方案,准备用这种方案来实施了.
即在Controller中封装在代理TransactionProxyFactoryBean里,保证Controller的某个方法(比如onSubmit-_-!)是业务的入口,这样,所有Service只要在这里调用,都可以保证在一个事务中.

Spring的确支持嵌套事务的,前提是从代理中定义的一个方法作为入口.coolzyt的说法正解.

感谢大家的支持.经过了2天的努力,终于把这些代码纠正过来了,谢谢,准备发分了,大家还有什么讨论的吗?

好困......

项目背景:Servlet版老产品,经常收到用户的定制需求,而旧版框架设计思想比较老,冗余代码等各种问题较多,于是向spring框架过渡.在spring框架的事务处理上遇到了与元框架差异较大的地方,故发此贴.呵呵,学到了很多.
schumiXsuse 2007-09-10
  • 打赏
  • 举报
回复
看样子,spring的事务机制远远不如EJB的嵌套事务控制来得强大.
用这种死板的事务控制,造成别的平台开发的各种项目向spring移植时的成本增加了很多.
当然,这也合项目组设计框架时考虑不周全有关.
请问各位,spring还有没有其他的事务解决方案呢?
------------------------------------------------------------------------------------
spring也支持嵌套事务的。
cl55 2007-09-10
  • 打赏
  • 举报
回复
注意一下propagation的值,如果在更高一层中使用事务,在这层中调用多个service,就要跟据你的需要正确设定这值。
zjf405 2007-09-10
  • 打赏
  • 举报
回复
你可以在service层上再做一个代理层,对这个代理层做事务控制,然后Controller调用这个代理层~
keel47 2007-09-10
  • 打赏
  • 举报
回复
另外,dao是封装数据访问而不是封装业务逻辑用的,在Service中直接调用Dao在本项目中被定为禁则.楼上所说的dao实际是指封装业务逻辑的Manager层吧?
keel47 2007-09-10
  • 打赏
  • 举报
回复
看样子,spring的事务机制远远不如EJB的嵌套事务控制来得强大.
用这种死板的事务控制,造成别的平台开发的各种项目向spring移植时的成本增加了很多.
当然,这也合项目组设计框架时考虑不周全有关.
请问各位,spring还有没有其他的事务解决方案呢?
coolzyt 2007-09-08
  • 打赏
  • 举报
回复
楼上正解,就是spring事务只能在一个方法里面有效。
加载更多回复(2)

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧