ICode9

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

Spring中的声明式事务

2021-04-13 15:01:26  阅读:171  来源: 互联网

标签:转账 事务 Spring 数据库 要么 一致性 100 声明


声明式事务

1. 回顾事务

  • 把一组业务当成一个来做,要么都成功,要么都失败
  • 事务在项目开发中,十分重要,涉及到数据的一致性问题,不能马虎!
  • 确保完整性和一致性

2. 事务的ACID原则

  • 原子性(Atomicity)

    • 原子性指事务是数据库工作的最小单位,一个事务中的所有操作要么全部成功提交,要么全部失败回滚
    • 以经典的银行转账情境为例,假设A和B两个账户分别拥有100元,此时A向B转账100元。对于数据层面包含两个操作:

    操作1:A账户余额减少100元,账户余额为0元;
    操作2:B账户余额增加100元,账户余额为200元

显然这两个操作要么同时成功则转账成功,要么同时失败则转账失败。此时这两个操作应在同一个事务中。

  • 一致性(Consistency)
    • 一致性指事务操作不能破坏数据的一致性,数据库在一个事务的执行前后都应处于一致性状态。仍以上述转账情境为例:在转账事务前后数据库中的总钱数都应是200元。假设在修改数据的过程中数据库发生故障(例如宕机)则事务被迫中断,此时如果未完成的事务中的部分操作已经写入数据库则会破坏数据的一致性。
  • 隔离性(Isolation)
    • 隔离性指数据库并发情况下,并发的事务直接是隔离的,一个事务的执行不能被其他事务影响
  • 持久性(Durability)
    • 持久性指一旦事务提交,则其对数据的变更就是永久性的,即使数据库发生任何故障都不应该对数据造成任何影响。持久性很好理解,如果上述转账事务成功前数据库故障,重启后A和B账户仍应各有100元;反正如果在事务成功后故障,那么重启后A和B账户应分别拥有0元和200元。

3. Spring中的事务管理

  • 声明式事务:AOP
  • 编程式事务:需要在代码中,进行事务的管理
<!--配置声明式事务-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

    <!--结合AOP实现事务的织入-->
    <!--配置事务通知-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <!--给那些方法配置事务-->
    <!--配置事务的传播特性 new propagation-->
        <tx:attributes>
            <tx:method name="add" propagation="REQUIRED"/>
            <tx:method name="delete" propagation="REQUIRED"/>
            <tx:method name="update" propagation="REQUIRED"/>
            <tx:method name="query" read-only="true"/>
            <tx:method name="*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>

    <!--配置事务切入-->
    <aop:config>
        <aop:pointcut id="pointcut" expression="execution(* com.kuang.mapper.*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
    </aop:config>

思考:为什么需要事务?

  • 如果不配置事务,可能存在数据提交不一致的情况;
  • 如果我们不在Spring中去配置声明式事务,我们就需要在代码中手动配置事务
  • 事务在项目的开发中十分重要,涉及到项目的一致性和完整性问题,不容马虎!

标签:转账,事务,Spring,数据库,要么,一致性,100,声明
来源: https://blog.csdn.net/weixin_44415209/article/details/115666561

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

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

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

ICode9版权所有