Spring中的事务管理

Spring中的事务管理,第1张

目录
    • 一、事务简介
    • 二、四大特性 (ACID)
    • 三、核心配置文件
    • 四、为什么要使用Mybatis整合Spring
    • 五、隔离级别和事务的传播行为
      • TransactionDefinition 接口中定义的隔离级别
      • TransactionDefinition 接口中定义的7种事务传播行为

一、事务简介

事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在关系数据库中,一个事务由一组 SQL 语句组成。事务应该具有 4 个属性:原子性、一致性、隔离性、持久性。这四个属性通常成为 ACID 特性

二、四大特性 (ACID)

1. 原子性(Atomicity):事务是一个不可分割的工作单位,事务中包含许多 *** 作,要么都做,要么都不做

2. 一致性(Consistency):事务必须使数据库从一个一致性转发太变到另一个一致性状态,事务的中间状态不能被观察到

3. 隔离性(Isolation):一个事务的执行不能被其它事务干扰。即一个事务内部的 *** 作及使用的数据对并发的其它事务是隔离的,并发执行的各个事物之间不能互相干扰。隔离性又分为四个级别:读未提交(read uncommitted)、读已提交(read committed,解决脏读)、可重复读(repeatable read,解决虚读)、 串行执行(serializable,解决幻读)

  • 读未提交:允许另外一个事务读取到当前未提交的数据,隔离级别最低,可能导致脏读、幻读或不可重复读

  • 读已提交:被一个事务修改的数据提交后才能被另外一个事务读取,可以避免脏读,无法避免幻读、而且不可重复读

  • 可重复读:允许重复读,可避免脏读,资源消耗上升。这是MySQL数据库的默认隔离级别

  • 串行执行:也就是按照时间顺序执行多个事务,不存在并发问题,最可靠,但性能与效率最低

4. 持久性(Durability):持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他 *** 作或故障不应该对其有任何影响

为什么需要事务?

  • 如果不配置事务,可能存在数据提交不一致的情况
  • 如果不在Spring中去配置声明式事务,我们就需要在代码中手动配置事务
  • 事务在项目的开发中十分重要,设计到数据的一致性和完整性问题
三、核心配置文件

spring核心文件配置(通过横切技术实现)


<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
bean>



<tx:advice id="txADVICE" transaction-manager="transactionManager">
    
    
    <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="txPointCut" expression="execution(* com.vinjcent.service.*.*(..))"/>
    <aop:advisor advice-ref="txADVICE" pointcut-ref="txPointCut"/>
aop:config>

四、为什么要使用Mybatis整合Spring

使用 Mybatis-Spring 的其中一个主要原因是它允许 Mybatis 参与到 Spring 的事务管理中。而不是给 MyBatis 创建一个新的专用事务管理器,MyBatis-Spring 借助了 Spring 中的 DataSourceTransactionManager 来实现事务管理

一旦配置好了 Spring 的事务管理器,你就可以在 Spring 中按你平时的方式来配置事务。并且支持@Transactional注解和 AOP 风格的配置。在事务处理期间,一个单独的 SqlSession 对象将会被创建和使用。当事务完成时,这个 session 会以合适的方式提交或回滚

事务配置好了以后,Mybatis-Spring 将会透明地管理事务。这样在你的 Dao 类中就不需要额外的代码了

五、隔离级别和事务的传播行为
TransactionDefinition 接口中定义的隔离级别
隔离级别说明
ISOLATION_DEFAULT采用当前数据库默认的事务隔离级别
ISOLATION_READ_UNCOMMITTED读未提交。允许另外一个事务读取到当前未提交的数据,隔离级别最低,可能导致脏读、幻读或不可重复读
ISOLATION_READ_COMMITTED读已提交。被一个事务修改的数据提交后才能被另外一个事务读取,可以避免脏读,无法避免幻读、而且不可重复读
ISOLATION_REPEATABLE_READ允许重复读,可避免脏读,资源消耗上升。这是MySQL数据库的默认隔离级别
REPEATABLE_SERIALIZABLE事务串行执行,也就是按照时间顺序执行多个事务,不存在并发问题,最可靠,但性能最低
TransactionDefinition 接口中定义的7种事务传播行为
事务传播行为说明
PROPAGATION_REQUIRED默认的事务传播行为。如果当前存在一个事务,则加入该事务;如果当前没有事务,则创建一个新的事务
PROPAGATION_SUPPORTS如果当前存在一个事务,则加入该事务;如果当前没有事务,则以非事务方式执行
PROPAGATION_MANDATORY当前必须存在一个事务,如果没有,就抛出异常
PROPAGATION_REQUIRES_NEW创建一个新的事务,如果当前已存在一个事务,将已存在的事务挂起
PROPAGATION_NOT_SUPPORTED不支持事务,在没有事务的情况下执行,如果当前已存在一个事务,则将已存在的事务挂起
PROPAGATION_NEVER永远不支持当前的事务,如果当前已存在一个事务,则抛出异常
PROPAGATION_NESTED如果当前存在事务,则在当前事务的一个子事务中执行

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/870429.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-13
下一篇2022-05-13

发表评论

登录后才能评论

评论列表(0条)

    保存