zoukankan      html  css  js  c++  java
  • @Transactional、Spring的声明式事务

    传送门
    一、Spring的声明式事务

    需要在xml文件中配置

    <!--配置事务管理器类-->
    <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
          <!--这里的dataSource引用前边配置好的dataSource-->
        <constructor-arg name="dataSource" ref="dataSource"/>
    </bean>
    
    <!--事务的建议-->
    <tx:advice id="interceptor" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="get*" read-only="true"/>
            <tx:method name="select*" read-only="true"/>
            <tx:method name="*"/>
        </tx:attributes>
    </tx:advice>
    
    <!--配置事务切面-->
    <aop:config proxy-target-class="true" expose-proxy="true">
        <!--切点为该包下的所有类的所有方法,任意返回值,任意参数-->
        <aop:pointcut id="txPointCut" expression="execution(* geek.service.*.* (..))"/>
        <!--在切点处加入事务-->
        <aop:advisor advice-ref="interceptor" pointcut-ref="txPointCut"></aop:advisor>
    </aop:config>
    

    <tx:advice.../>节点详情如下图
    tx:advice

    name:指定方法的名称可以使用通配符

    propagation:指定事务的传播行为,默认为为PROPAGATION_REQUIRED

    PROPAGATION_REQUIRED:要求在事务环境中执行该方法,如果当前执行线程已经处于事务环境中,则直接调用;如果当前线程不处于事务环境中,则启动新的事务后执行该方法.

    PROPAGATION_MANDATORY:要求调用该方法的线程必须处于事务中,否则抛出异常

    PROPAGATION_NESTED:即使执行该方法的线程已经处于事务中们也依然启动新的事务,方法在嵌套的事务里执行;即使执行该方法的线程未处于事务环境中,也启动新的事务,然后执行该方法,此时与默认情况一致.

    PROPAGATION_NEVER:不允许调用该方法的线程处于事务环境中,如果调用该方法的线程处于事务环境中,则抛出异常

    PROPAGATION_NOT_SUPPORTED:如果调用该方法的线程处于事务中,则先暂停当前事务,然后执行该方法

    PROPAGATION_REQUIRED_NEW:该方法要求在新的事务环境中执行,如果当前执行线程已处于事务环境中,则先暂停当前事务,启动新的事务后执行该方法,如果当前线程不处于事务环境中,则启动新的事务后执行方法.

    PROPAGATION_SUPPORTS:如果当前线程处于事务环境中,则使用当前事务,否则不使用事务

    isolation:指定事务的隔离级别

    timeout:指定事务的超时时间

    read-only:指定事务是否只读

    rollback-for:指定触发事务回滚的异常类(全类名限定),可以指定多个,用英文逗号,隔开

    no-rollback-for:指定不处罚事务回滚的异常类(全类名限定),可以指定多个,用英文逗号,隔开

    二、使用@Transactional注解进行事务管理

    需要在xml文件里配置

    <bean id="transactionManager"
              class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <constructor-arg name="dataSource" ref="dataSource"/>
    </bean>
    <!--启动@Transactional注解-->
    <tx:annotation-driven transaction-manager = "transactionManager"/>
    

    @Transactional注解即可以用于修饰Spring Bean类,也可以用于修饰Bean类中的某个方法

    如果使用该注解修饰Bean类,表明这些事务设置对整个Bean起作用;如果使用该注解修饰Bean类的方法,则表明这些事务设置只对该方法有效。

    @Transactional注解的属性:

    isolation:用于指定事物的隔离级别.默认为底层事务的隔离级别

    noRollbackFor:用于指定遇到某个特定异常时强制不回滚事务

    noRollbackForClassName:指定遇到特定的多个异常时强制不回滚事务,可以指定多个异常类名

    propagation:指定事务的传播行为

    readOnly:指定是否只读

    rollbackFor:指定遇到特定异常时强制回滚事务

    rollbackForClassName:指定遇到特定的多个异常时强制回滚事务.可以设置多个异常类名

    timeout:指定事务的超时时长

    @Transactional注解中所指定的属性与<tx:advice.../>元素中所指定的事务属性基本上是对应的。

  • 相关阅读:
    Input:type属性
    HttpServletRequest的方法详细说明
    leetcode 第一题 Two Num java
    python之路
    Elasticsearch template学习
    利用Supervisor来守护我们自己的进程
    安装与使用ansible-Centos6.5
    Elasticsearch的一个清理Index脚本
    用统计模拟的方法分析微信抢红包
    数据挖掘R与SQL
  • 原文地址:https://www.cnblogs.com/yuanmiemie/p/6739769.html
Copyright © 2011-2022 走看看