• 声明式事务编程


    声明式事务:可知编程式事务每次实现都要单独实现,但业务量大功能复杂时,使用编程式事务无疑是痛苦的,而声明式事务不同,声明式事务属于无侵入式,不会影响业务逻辑的实现。

    声明式事务实现方式主要有2种,一种为通过使用Spring的<tx:advice>定义事务通知与AOP相关配置实现,另为一种通过@Transactional实现事务管理实现,下面详细说明2种方法如何配置,已经相关注意点
    1)方式一,配置文件如下
    <!-- 
    <tx:advice>定义事务通知,用于指定事务属性,其中“transaction-manager”属性指定事务管理器,并通过<tx:attributes>指定具体需要拦截的方法
        <tx:method>拦截方法,其中参数有:
        name:方法名称,将匹配的方法注入事务管理,可用通配符
        propagation:事务传播行为,
        isolation:事务隔离级别定义;默认为“DEFAULT”
        timeout:事务超时时间设置,单位为秒,默认-1,表示事务超时将依赖于底层事务系统;
        read-only:事务只读设置,默认为false,表示不是只读;
        rollback-for:需要触发回滚的异常定义,可定义多个,以“,”分割,默认任何RuntimeException都将导致事务回滚,而任何Checked Exception将不导致事务回滚;
        no-rollback-for:不被触发进行回滚的 Exception(s);可定义多个,以“,”分割;
     -->
    <tx:advice id="advice" transaction-manager="transactionManager">
        <tx:attributes>
            <!-- 拦截save开头的方法,事务传播行为为:REQUIRED:必须要有事务, 如果没有就在上下文创建一个 -->
            <tx:method name="save*" propagation="REQUIRED" isolation="READ_COMMITTED" timeout="" read-only="false" no-rollback-for="" rollback-for=""/>
            <!-- 支持,如果有就有,没有就没有 -->
            <tx:method name="*" propagation="SUPPORTS"/>
        </tx:attributes>
    </tx:advice>
    <!-- 定义切入点,expression为切人点表达式,如下是指定impl包下的所有方法,具体以自身实际要求自定义  -->
    <aop:config>
        <aop:pointcut expression="execution(* com.kaizhi.*.service.impl.*.*(..))" id="pointcut"/>
        <!--<aop:advisor>定义切入点,与通知,把tx与aop的配置关联,才是完整的声明事务配置 -->
        <aop:advisor advice-ref="advice" pointcut-ref="pointcut"/>
    </aop:config>
    关于事务传播行为与隔离级别,可参考http://blog.csdn.net/liaohaojian/article/details/68488150
    注意点:
    1. 事务回滚异常只能为RuntimeException异常,而Checked Exception异常不回滚,捕获异常不抛出也不会回滚,但可以强制事务回滚:TransactionAspectSupport.currentTransactionStatus().isRollbackOnly();
    2. 解决“自我调用”而导致的不能设置正确的事务属性问题,可参考http://www.iteye.com/topic/1122740

    2)方式二通过@Transactional实现事务管理

    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">   
         <property name="dataSource" ref="dataSource"/>
    </bean>    
    <tx:annotation-driven transaction-manager="txManager"/> //开启事务注解
    @Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.READ_COMMITTED),具体参数跟上面<tx:method>中一样
    Spring提供的@Transaction注解事务管理,内部同样是利用环绕通知TransactionInterceptor实现事务的开启及关闭。
    使用@Transactional注意点:
      1. 如果在接口、实现类或方法上都指定了@Transactional 注解,则优先级顺序为方法>实现类>接口;
      2. 建议只在实现类或实现类的方法上使用@Transactional,而不要在接口上使用,这是因为如果使用JDK代理机制(基于接口的代理)是没问题;而使用使用CGLIB代理(继承)机制时就会遇到问题,因为其使用基于类的代理而不是接口,这是因为接口上的@Transactional注解是“不能继承的”;
  • 相关阅读:
    C# ToString() 转字符串设置保留小数位数
    PHP生成随机字符方法
    PHP面向对象程序设计的61条黄金法则
    CakePHP manual 中文翻译3
    CakePHP manual 中文翻译6
    在ASP中常见的错误80004005信息和解决办法
    CakePHP manual 中文翻译1
    CakePHP manual 中文翻译4
    CakePHP manual 中文翻译8
    如何在html文件中包含其他html文件
  • 原文地址:https://www.cnblogs.com/lukelook/p/11133656.html
Copyright © 2020-2023  润新知