zoukankan      html  css  js  c++  java
  • SpringAOP事务的实现

    1、配置事务: 使用的tx前缀的标签, 导入tx的命名空间

    配置事务管理器 , 把事务管理器交给Spring管理:

    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <!-- 注入DataSource -->
            <property name="dataSource" ref="dataSource"/>
    </bean>

    事务的策略
    transaction-manager: 事务增强基于那个事务管理器, 默认值: transactionManager(bean的id)
    如果事务管理器的id为transactionManager, 在tx:advice标签中不需要添加transaction-manager属性

    <tx:advice id="txAdvice" transaction-manager="txManager">
    <!-- 声明事务的规则 : 针对业务层的不同的方法,采用不同的规则-->
        <tx:attributes>
          <tx:method name="find*" read-only="true" propagation="SUPPORTS" />
              <tx:method name="query*" read-only="true" propagation="SUPPORTS"/>
              <tx:method name="get*" read-only="true" propagation="SUPPORTS"/>
              <tx:method name="add*" propagation="REQUIRED"  rollback-for="java.lang.Exception"/>
              <tx:method name="del*" propagation="REQUIRED"  rollback-for="java.lang.Exception"  timeout="2"/>
              <tx:method name="update*" propagation="REQUIRED"  rollback-for="java.lang.Exception"/>
              <tx:method name="*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>

    事务规则的语法:

    • name: 表示业务层的方法名
    • read-only: 只读, true 查询中使用这个属性, 默认值: false
    • propagation: 事务传播机制:
    *** REQUIRED:默认值,表示如果存在一个事务,则支持当前事务,如果当前没有事务,则开启一个新的事务.  增删改
    *** SUPPORTS:表示如果存在一个事务,则支持当前事务,如果当前没有事务,则按非事务方式执行, 查询
        MANDATORY:表示如果存在一个事务,则支持当前事务,如果当前没有事务,则抛出异常
        REQUIRES_NEW:表示总是开启一个新的事务,如果当前有一个事务,则将当前事务挂起,开启新事物执行方法.
        NOT_SUPPORTED:表示总是以非事务方式执行.如果一个事务已经存在,则将这个存在的事务挂起,然后执行方法.
        NEVER:表示总是以非事务方式执行.如果当前存在一个活动的事务,则抛出异常
        NESTED:表示如果当前存在一个活动的事务,则创建一个事务作为当前事务的嵌套事务运行,如果没有当前事务,该取值与REQUIRED相同.
    • timeout: 超时, -1 永不超时, 默认值,   正整数, 单位秒
    • rollback-for="异常类型", 针对哪一种异常类型进行回滚, ,默认值:RuntimeException
    • no-rollback-for="异常类型", 不对哪一种异常类型进行回滚
    • isolation: 事务隔离级别:  数据库来决定
    DEFAULT:默认值,表示使用数据库默认的事务隔离级别
    READ_UNCOMMITTED:读未提交, 读取到未提交的数据, 所有的数据库都不采用
    READ_COMMITTED:读已提交   oracle
    REPEATABLE_READ: 可重复读  mysql
    SERIALIZABLE: 串行读   安全性最高, 效率最低
    • timeout: 从执行业务方法开始,到执行完sql语句之间的时候

    事务的织入 (把这个事务的通知对那些类的那些方法进行增强)

     <!-- 事务的织入 ,把这个事务的通知对那些类的那些方法进行增强-->
        <aop:config>
            <!-- 切入点-->
            <aop:pointcut expression="execution(* spring07.service..*.*(..))" id="pointcut1"/>
            <!-- 织入 
                advice-ref: 通知类的bean
                pointcut-ref: 切入点
            -->
            <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/>
        </aop:config>

    脏读 :一个事务读到了另一个事务的未提交的数据
    不可重复读 :一个事务读到了另一个事务已经提交的 update 的数据导致多次查询结果不一致
    幻读 :一个事务读到了另一个事务已经提交的 insert 的数据导致多次查询结果不一致

    Spring 事务管理详解(转载):https://www.cnblogs.com/liantdev/p/10149443.html

  • 相关阅读:
    Shell编程进阶 1.2 shell结构及执行
    LNMP 1.6 常见的502问题解决
    关于贴图看不到。显示是白色或者其他。
    windows 任务栏图标宽度固定
    Install Oracle Java JDK/JRE 7u55 on Fedora 20/19, CentOS/RHEL 6.5/5.10
    盘点天龙历史:七年以来所有资料片
    linux shell 逻辑运算符、逻辑表达式详解
    vim 把满足条件的数字进行加上一些数字
    win7 一些快捷系统工具命令
    Linux下用C读取配置文件。类似ini这样。
  • 原文地址:https://www.cnblogs.com/64Byte/p/13118009.html
Copyright © 2011-2022 走看看