声明式事务

8、声明式事务

8.1、事务ACID原则

参考万里顾—程的博客

  • 原子性(atomicity)
    • :事务中包括的操作要么都做,要么都不做
  • 一致性 (consistency)
    • :针对一个事务操作前与操作后的状态一致
  • 隔离性(isolation)
    • :一个事务的执行不能被其他事务干扰
    • 造成的问题:
      1. 脏读:指一个事务读取了另外一个事务未提交的数据
      2. 不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同(数据内容不一致)
      3. 幻读:是指在一个事务内读取到了别的事务插入的数据,导致前后读取到的数据不一致
  • 持久性 (durability)
    • :指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,不可逆的
      1. 如果在操作之前(事务还没有提交)服务器宕机或者断电,那么重启数据库之后,数据状态还是操作之前的,恢复到原状
      2. 如果在操作后(事务已经提交)服务器宕机或者断电,那么重启数据库之后,数据状态应为操作之后的,持久化到数据库

8.2、spring中配置声明式事务

  • 配置声明事务

        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
        </bean>
    
  • 结合AOP实现事务的织入

  • 配置事务通知

        <tx:advice id="transactionInterceptor" transaction-manager="transactionManager">
            <tx:attributes>
    <!--     需要开启事务订单方法       -->
    <!--            传播特性 propagation 默认是REQUIRED-->
    <!--            read-only="true"表只读事务-->
                <tx:method name="queryAllUser" propagation="REQUIRED"/>
                <tx:method name="deleteUserById" propagation="REQUIRED"/>
                <tx:method name="addUser" propagation="REQUIRED"/>
                <tx:method name="*"/>
            </tx:attributes>
        </tx:advice>
    
    • propagation

      传播行为(PROPAGATION) 描述
      PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是最常见的选择。
      PROPAGATION_SUPPORTS 支持当前事务,如果没有当前事务,就以非事务方法执行
      PROPAGATION_MANDATORY 使用当前事务,如果没有当前事务,就抛出异常
      PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起
      PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
      PROPAGATION_NEVER 以非事务方式执行操作,如果当前事务存在则抛出异常
      PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED 类似的操作

      原文链接:https://blog.csdn.net/zhangsweet1991/article/details/83897211

  • 事务的切入 ,我用的这个版本spring开启事务的时候需要把proxy-target-class="true"开启cglib的方式

    <!--    - 事务的切入-->
        <aop:config proxy-target-class="true">
            <aop:pointcut id="txPointcut" expression="execution(* com.mhy.mapper.*.*(..))"/>
            <aop:advisor advice-ref="transactionInterceptor" pointcut-ref="txPointcut"/>
        </aop:config>
    
posted @ 2022-03-25 17:23  水三丫  阅读(56)  评论(0)    收藏  举报