锁定老帖子 主题:讨论多个service事务问题?
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2005-03-18
我的问题是:怎样通过配置文件,来确保在业务逻辑DService中调用的AService、BService、CServiced在同一个事物中? 例如三个程序员分别写了三个业务逻辑分别为AService、BService、CService 对应的ADao、BADao、CDao 现在我想写一个业务逻辑DService,在Dservice中调用其它几个业务逻辑AService、BService、CService, 怎样通过配置文件,来确保在业务逻辑DService中调用的AService、BService、CServiced在同一个事物中? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2005-03-19
你的做法是不对的,应该是在Dservice中调用ADao、BADao、CDao,并确保他们在一个事务里,而不是调用AService、BService、CService
|
|
返回顶楼 | |
发表时间:2005-03-19
Service1调用Service2的情况当然是有的,spring好象也支持这样的事务?我现在用了一个比较bt的方法,给所有的service的方法都加一个interceptor,在interceptor中判断当前方法调用前是否有事务,没有则开始新事务并在当前方法结束时commit事务.
|
|
返回顶楼 | |
发表时间:2005-03-20
给D配制成REQUIRED_NEW,A,B,C配置成REQUIRED行不行?
|
|
返回顶楼 | |
发表时间:2005-03-20
那你应该在封装这些service的更高一层,一个actionController里来完成事务,而不是在原来service里.
|
|
返回顶楼 | |
发表时间:2005-03-20
Spring 是支持嵌套事务的
引用 事务传播:通常在一个事务中执行的所有代码都会在这个事务中运行。但是,如果当一个事务上下文已经存在时, 一个事务方法被执行,有几个选项可以指定其行为:例如,简单地在现有的 事务中运行(大多数情况);或者挂起现有事务,创建一个新的事务。 Spring提供EJB CMT中熟悉的事务传播选项。 |
|
返回顶楼 | |
发表时间:2005-03-20
如果你是想a,b,c也都在单独的事务中,那么应该使用嵌套事务,不过嵌套事务的支持是通过savepoint支持的。也就是要你的数据库驱动支持这个特性,否则是没法使用的。
如果只是单纯的想要a,b,c的逻辑作为一个整体在同一个事务中,那么用required_new和required就可以了。 |
|
返回顶楼 | |
发表时间:2005-03-21
补充说明:
其中AService、BService、CServiced有时需要单独使用。 不知怎样使用“嵌套事务”,能否给一个例子? 如果通过一个intercepto来判断当前方法调用前是否有事务,应该怎样写? 多谢! |
|
返回顶楼 | |
发表时间:2005-03-21
大概我没有说清楚,看看嵌套事务的概念,你是否真的需要嵌套事务。如果你确实需要,你只要给a,b,c配置为PROPAGATION_NESTED就可以了。不需要的话,配置为PROPAGATION_REQUIRED。
嵌套式事务模型 嵌套有子事务,子事务中还可以嵌套有子事务,整个是一个树形结构。旅行计划问题: * 购买从美国波士顿到美国纽约的火车票 * 购买从美国纽约到英国伦敦的飞机票 * 购买从英国伦敦到法国巴黎的气艇票 * 发现没有飞往法国巴黎的气艇票 这对于平面型事务来说,只能有一个选择:事务失败。这样由于没有飞往巴黎的气艇票,将会取消所有的出行计划。但是在这里,完全可以采用其他的旅行方式(购买火车票或者飞机票)来代替气艇。因此需要一个更加健壮的事务模型来解决这个问题。可以将整个事务划分为若干个子事务,整个事务可以重新执行单个子事务来尝试完成事务,如果最终某个单个子事务无法完成,则整个事务失败。 |
|
返回顶楼 | |
发表时间: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) |
|
返回顶楼 | |