一般来讲,控制事务都应该是在services层去做的,但是我想问一下,在spring中是否应该使用声明式事务来进行控制。还有没有其他的方法,一般我们看到比较常用的是spring去调用hibernate的事务方法。(是在xml中进行配置)
那么最重要的一点是:我如何让spring来辨别我的事务是在service层,还是在dao层进行的控制呢,这一点如何去配置。是在配置文件中,还是在每个service的java文件中?

解决方案 »

  1.   

    spring支持两种事务声明方式:编程式与声明式
    个人推荐使用声明式 编程式的声明方式对代码是有侵略性的 不建议使用
    声明式事务体现了aop的核心思想 在spring中可以由xml配置实现
    <aop:config >
    <aop:aspect id="aophandler" ref="aopHandler">

    <aop:pointcut id="engine1" expression="execution(* bc.engine.*.biz.impl.*.*(..))"/>
    <aop:after method="keepLog" pointcut-ref="engine1"/>
    <aop:pointcut id="engine2" expression="execution(* bc.engine.iflow.biz.*Impl.*(..))"/>
    <aop:after method="keepLog" pointcut-ref="engine2"/>

    <aop:pointcut id="tbmbiz" expression="execution(* bc.tbm.*.business.*HandlerImpl.*(..))"/>
    <aop:after method="keepLog" pointcut-ref="tbmbiz"/>

    <aop:pointcut id="pmsbiz" expression="execution(* bc.pms.*.service.impl.*.*(..))"/>
    <aop:after method="keepLog" pointcut-ref="pmsbiz"/>
    </aop:aspect>
    </aop:config>上面是一个配置实例 你可以了解一下 看下spring的aop和声明式事务控制部分
    希望对你有帮助
      

  2.   

    你这种方法似乎是要对每一个service都要进行控制配置声明,这样岂不很麻烦,有没有简单的方式,可以对整体的,如services或dao进行统一控制的
      

  3.   

    一般不会对dao进行控制。  所谓事务是指一系列的业务操作,可能涉及多次操作数据库(更新、插入等)。 
    Spring的事务分为申明式事务,以及编程式事务。 我们用的最多的还是申明式事务。因为申明式事务解耦,事务不用跟业务代码耦合起来,以后更改事务控制也方便。   不需要对每一个事务都进行控制配置的。。 可以用通配符:*  来进行模糊匹配。
    还有,spring的事务并不是只能在用hibernate时才使用,他对JPA,JTA,JDBC,hibernate等持久层技术都提供不同的事务支持。    事务的东西,不是别人三言两语就能跟你说清楚的。 介绍你看<spring in action>第二版,有中文版的,做为Spring的入门书,这是一个不错的选择。只要你肯去啃这本书,相信你会很有收获。。   
      

  4.   

    个人喜欢在XML中进行配置,这样配置信息比较集中。
    一般不在DAO进行配置,DAO一般是单一性的操作,
    只要你的SERVICE是按照一定的规则定义的,完全一个配置就可以定义所有的切入点,切入点匹配是通过JAVA的正则表达式进行匹配的。。只要你按照类名可以挑出所有需要配置的类就可以了
      

  5.   

    一般而言,权限控制不应在DOA层控制。
    我们使用SSH是为了使开发业务逻辑更清晰、专业分工,降低程序之间的耦合性。Hibernate用来做持久层,Spring作业务层,因此权限控制应理所应当放在业务层处理。
    而Spring AOP的面向切面编程的能力,能够实现业务逻辑与权限控制的分离和解耦。你只需声明控制的切入点,不需要去管业务逻辑,就能在这些切入点进行权限拦截。而声明切点也是很简单灵活的,如果你觉得对每一个service都要进行控制配置声明麻烦,就像3楼说的,可以用*通用匹配。
      

  6.   

    在dao层配置事务确实很少见的。 一般在service层处理,事务时具有传播性的,dao层可以运行在service层的事务里运行。
      

  7.   


    我的了解是在每个service类中都需要加入@transactional标示符,请问如果这样的话,是不是配置文件那边也还要去用aop标签去配置
      

  8.   


    <!-- 配置事务传播特性 -->
    <tx:advice id="transactionAdvice" transaction-manager="transactionManager">
    <tx:attributes>
    <tx:method name="save*" propagation="REQUIRED" />
    <tx:method name="delete*" propagation="REQUIRED" />
    <tx:method name="update*" propagation="REQUIRED" />
    <tx:method name="get*" read-only="true" />
    <tx:method name="load*" read-only="true" />
    <tx:method name="find*" read-only="true" />
    <tx:method name="*" read-only="true" />
    </tx:attributes>
    </tx:advice> <!-- 配置哪些类的哪些方法参与事务 -->
    <aop:config>
    <aop:advisor pointcut="execution(* com.lookhan.service..*.*(..))" advice-ref="transactionAdvice" />
    </aop:config>
    不知道楼主问的是不是这个。* com.lookhan.service..*.*(..)表示在service包下及其子包的所有类的所有方法,以及方法的任何参数和返回值。
      

  9.   

    声明式事务没用过~~ 习惯了配置型的~事务一般是控制在service层 因为DAO的方法大部分都是一个具体的数据库操作 
    通过AOP 给service层通配个事务拦截器就行了
      

  10.   


    这个就是基本的配置好不好,上面是针对不同的方法的,如果你真的非要再简单点的,那就只加一个*就可以了。你要怎样的简单?再怎么简单也要针对一个Service里面的方法吧,这个总得配置吧。
      

  11.   

    初学spring者
    事务的配置:
    <bean id="TransAction"
    class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor" >
    <property name="advice">
    <ref local="TranInterceptor" />
    </property>
    <property name="mappedNames">
    <list>
    <value>*TransAction</value>
    </list>
    </property>
    </bean> 
    <bean id="TranInterceptor" class="TransactionInterceptor" />
    类TransactionInterceptor写具体的事务处理,在Business层添加 Bean TransAction,Business层的类有关事务处理的方法要以TransAction结尾
      

  12.   

    Spring事务我用过的有三种1、编程式事务。
    2、声明式事务。
    3、注解式事务。在DAO层启动事务,我还木有用过。怎么判断事务是在哪个层启动的,我也不知道
      

  13.   


    你指的是对某个方法的事务指定,我说的是针对某一个类的事务指定,比如在service层中有多个逻辑类,那么里面肯定都会用到类似的事务处理,因此我只要对该类进行配置就可以了。