ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

声明式事务

2022-03-25 17:33:55  阅读:176  来源: 互联网

标签:事务 读取 PROPAGATION 当前 如果 操作 声明


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>
    

标签:事务,读取,PROPAGATION,当前,如果,操作,声明
来源: https://www.cnblogs.com/shuisanya/p/16055794.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有