你的做法是不对的,应该是在一个service中调用多个dao,并确保他们在一个事务里,而不是调用多个dao

解决方案 »

  1.   

    如果非要使用多个service,就考虑在更高一层中使用事务,在这层中调用多个service
      

  2.   

    楼上正解,就是spring事务只能在一个方法里面有效。
      

  3.   

    看样子,spring的事务机制远远不如EJB的嵌套事务控制来得强大.
    用这种死板的事务控制,造成别的平台开发的各种项目向spring移植时的成本增加了很多.
    当然,这也合项目组设计框架时考虑不周全有关.
    请问各位,spring还有没有其他的事务解决方案呢?
      

  4.   

    另外,dao是封装数据访问而不是封装业务逻辑用的,在Service中直接调用Dao在本项目中被定为禁则.楼上所说的dao实际是指封装业务逻辑的Manager层吧?
      

  5.   

    你可以在service层上再做一个代理层,对这个代理层做事务控制,然后Controller调用这个代理层~
      

  6.   

    注意一下propagation的值,如果在更高一层中使用事务,在这层中调用多个service,就要跟据你的需要正确设定这值。
      

  7.   

    看样子,spring的事务机制远远不如EJB的嵌套事务控制来得强大.
    用这种死板的事务控制,造成别的平台开发的各种项目向spring移植时的成本增加了很多.
    当然,这也合项目组设计框架时考虑不周全有关.
    请问各位,spring还有没有其他的事务解决方案呢?
    ------------------------------------------------------------------------------------
    spring也支持嵌套事务的。
      

  8.   

    初学者,共同探讨,刚刚涉及spring事务,不太了解具体细节spring的事务传播规则不是定义事务的传播行为的吗,不是可以把一个刚刚开始的事务定义到正在运行的事务当中吗,楼主是不是可以考虑一下,我认为spring应该可以解决这个问题,只不过我还不是很清楚罢了。共勉!!
      

  9.   

    To zjf405(On№The①Road) 非常感谢你的提示,这是一个很不错的方案,准备用这种方案来实施了.
    即在Controller中封装在代理TransactionProxyFactoryBean里,保证Controller的某个方法(比如onSubmit-_-!)是业务的入口,这样,所有Service只要在这里调用,都可以保证在一个事务中.Spring的确支持嵌套事务的,前提是从代理中定义的一个方法作为入口.coolzyt的说法正解.感谢大家的支持.经过了2天的努力,终于把这些代码纠正过来了,谢谢,准备发分了,大家还有什么讨论的吗?好困......项目背景:Servlet版老产品,经常收到用户的定制需求,而旧版框架设计思想比较老,冗余代码等各种问题较多,于是向spring框架过渡.在spring框架的事务处理上遇到了与元框架差异较大的地方,故发此贴.呵呵,学到了很多.
      

  10.   

    什么情况下会遇到一个controller调用几个service,而这些service应该一起commit和rollback呢?个人觉得这样的逻辑完全可以用一个controller调用一个service来实现。
      

  11.   

    那你可以写一个service,在这个service中调用其他几个service.
      

  12.   

    事务的边界应该到service就够了,cotroller只该起到转换数据,控制页面流的作用。如果将业务逻辑放到了controller中,那你的单元测试将会很麻烦的。
      

  13.   

    楼上的全忽悠,SPRING的事务可以嵌套,并设置嵌套的时候的机制。所以其他一切全没问题,只要配置好就行了,根本没有“那你可以写一个service,在这个service中调用其他几个service”这个说法
      

  14.   

    NND,公司这几天封网,害的发分晚了好几天,抱歉了.
    楼上的几位所言极是,spring的事务应该在Service层处理.
    但本项目特殊,是一个移植性质的项目,而且现阶段无法做到和Spring100%的代码兼容.
    为了程序运行正常,许多地方得借鉴老项目的实现方式,比如事务控制,所以才出现了问题.