论坛首页 Java企业应用论坛

讨论多个service事务问题?

浏览 13431 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-03-18  
大家好今天花一天的时间了解了一下spring技术,
我的问题是:怎样通过配置文件,来确保在业务逻辑DService中调用的AService、BService、CServiced在同一个事物中?

例如三个程序员分别写了三个业务逻辑分别为AService、BService、CService
对应的ADao、BADao、CDao
现在我想写一个业务逻辑DService,在Dservice中调用其它几个业务逻辑AService、BService、CService,
怎样通过配置文件,来确保在业务逻辑DService中调用的AService、BService、CServiced在同一个事物中?
   发表时间:2005-03-19  
你的做法是不对的,应该是在Dservice中调用ADao、BADao、CDao,并确保他们在一个事务里,而不是调用AService、BService、CService
0 请登录后投票
   发表时间:2005-03-19  
Service1调用Service2的情况当然是有的,spring好象也支持这样的事务?我现在用了一个比较bt的方法,给所有的service的方法都加一个interceptor,在interceptor中判断当前方法调用前是否有事务,没有则开始新事务并在当前方法结束时commit事务.
0 请登录后投票
   发表时间:2005-03-20  
给D配制成REQUIRED_NEW,A,B,C配置成REQUIRED行不行?
0 请登录后投票
   发表时间:2005-03-20  
那你应该在封装这些service的更高一层,一个actionController里来完成事务,而不是在原来service里.
0 请登录后投票
   发表时间:2005-03-20  
Spring 是支持嵌套事务的

引用


事务传播:通常在一个事务中执行的所有代码都会在这个事务中运行。但是,如果当一个事务上下文已经存在时, 一个事务方法被执行,有几个选项可以指定其行为:例如,简单地在现有的 事务中运行(大多数情况);或者挂起现有事务,创建一个新的事务。 Spring提供EJB CMT中熟悉的事务传播选项。

0 请登录后投票
   发表时间:2005-03-20  
如果你是想a,b,c也都在单独的事务中,那么应该使用嵌套事务,不过嵌套事务的支持是通过savepoint支持的。也就是要你的数据库驱动支持这个特性,否则是没法使用的。
如果只是单纯的想要a,b,c的逻辑作为一个整体在同一个事务中,那么用required_new和required就可以了。
0 请登录后投票
   发表时间:2005-03-21  
补充说明:
其中AService、BService、CServiced有时需要单独使用。
不知怎样使用“嵌套事务”,能否给一个例子?
如果通过一个intercepto来判断当前方法调用前是否有事务,应该怎样写?
多谢!
0 请登录后投票
   发表时间:2005-03-21  
大概我没有说清楚,看看嵌套事务的概念,你是否真的需要嵌套事务。如果你确实需要,你只要给a,b,c配置为PROPAGATION_NESTED就可以了。不需要的话,配置为PROPAGATION_REQUIRED。

嵌套式事务模型
嵌套有子事务,子事务中还可以嵌套有子事务,整个是一个树形结构。旅行计划问题:

    * 购买从美国波士顿到美国纽约的火车票
    * 购买从美国纽约到英国伦敦的飞机票
    * 购买从英国伦敦到法国巴黎的气艇票
    * 发现没有飞往法国巴黎的气艇票

这对于平面型事务来说,只能有一个选择:事务失败。这样由于没有飞往巴黎的气艇票,将会取消所有的出行计划。但是在这里,完全可以采用其他的旅行方式(购买火车票或者飞机票)来代替气艇。因此需要一个更加健壮的事务模型来解决这个问题。可以将整个事务划分为若干个子事务,整个事务可以重新执行单个子事务来尝试完成事务,如果最终某个单个子事务无法完成,则整个事务失败。
1 请登录后投票
   发表时间:2005-03-22  
我按照你的方法配置了相应的service,
运行时出现如下错误,请问是什么问题!
我用的数据库是ms SQLServer2000

javax.servlet.ServletException: Pre-bound JDBC connection found - HibernateTransactionManager does not support running within DataSourceTransactionManager if told to manage the DataSource itself. It is recommended to use a single HibernateTransactionManager for all transactions on a single DataSource, no matter whether Hibernate or JDBC access.
org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:516)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:423)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:227)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1192)
org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:412)
javax.servlet.http.HttpServlet.service(HttpServlet.java:697)
javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
1 请登录后投票
论坛首页 Java企业应用版

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