spring事务

spring事务

Spring 事务概述

事务是一个不可分割的逻辑工作单元,具备ACID特性,实际工作中可借助Spring进行事务管理,Spring提供了两种事务管理方式, 编程式事务和声明式事务,本讲重点讲解实际项目中最常用的声明式事务管理,以简化事务的编码操作。

声明式事务的底层是使用 编程式事务方式来控制事务的,只不过对其进行了封装,让我们用起来更容易些。

例如现有两个订单操作,需要更新库存。

当库存充足时两个事务都可以成功,当库存不够时有的事务就要回滚。

Spring声明式事务管理底层基于AOP实现

Spring 声明式事务

Spring中声明式事务管理有两种方式,基于注解方式和基于xml方式。重点理解注解方式。

Spring 基于注解方式实现声明式事务管理。

  1. 在spring配置文件中启用事务注解

    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    		<property name="dataSource" ref="dataSource"/>
    </bean>
    <!--设置注解驱动的事务管理  -->
    <tx:annotation-driven transaction-manager="txManager"/>
    <tx:annotation-driven mode="aspectj" />
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    <bean class="org.springframework.transaction.aspectj.AnnotationTransactionAspect" factory-method="aspectOf">
       <property name="transactionManager" ref="transactionManager" />
    </bean>
    
  2. 在类或方法中使用@Transaction注解应用事务

    • name 当在配置文件中有多个 TransactionManager , 可以用该属性指定选择哪个事务管理器。

    • propagation 事务的传播行为,默认值为 REQUIRED。

    • isolation 事务的隔离度,默认值采用 DEFAULT。

    • timeout 事务的超时时间,默认值为-1。如果超过该时间限制但事务还没有完成,则自动回滚事务。

    • read-only 指定事务是否为只读事务,默认值为 false;为了忽略那些不需要事务的方法,比如读取数据,可以设置 read-only 为 true。

    • rollback-for 用于指定能够触发事务回滚的异常类型,如果有多个异常类型需要指定,各类型之间可以通过逗号分隔。

    • no-rollback- for 抛出 no-rollback-for 指定的异常类型,不回滚事务。

Spring 基于XML配置方式实现声明式事务管理(了解)

<tx:advice id="txAdvice"
transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*"
propagation="REQUIRED"
isolation="READ_COMMITTED"
timeout="-1"
read-only="false"
rollback-for="java.lang.Throwable"
no-rollback-for=”NoTransactionException"/>
</tx:attributes>
</tx:advice>

<aop:config>
<aop:pointcut id="operation" expression="execution(* beans.service..*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut="operation"/>
</aop:config>

Spring 事务的传播特性

重点掌握 Propagation.REQUIRED

@Transactional(propagation=Propagation.REQUIRED)

如果没有事务创建新事务, 如果当前有事务参与当前事务

@Transactional(propagation=Propagation.REQUIRES_NEW)

必须是新事务, 如果有当前事务, 挂起当前事务并且开启新事务

@Transactional(propagation=Propagation.MANDATORY)

必须有事务, 如果当前没有事务就抛异常

@Transactional(propagation=Propagation.NEVER)

绝对不能有事务, 如果在事务中调用则抛出异常

@Transactional(propagation=Propagation.NESTED)

必须被嵌套到其他事务中

@Transactional(propagation=Propagation.NOT_SUPPORTED)

不支持事务

@Transactional(propagation=Propagation.SUPPORTS)

支持事务, 如果没有事务也不会创建新事务

Spring 事务的隔离级别

一共有4种, 一般采用 @Transactional(isolation=Isolation.READ_COMMITTED) 级别, 是并发性能和安全性折中的选择. 是大多数软件项目采用的隔离级别.

Spring事务隔离级别比数据库事务隔离级别多一个default

  • DEFAULT (默认)

这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。另外四个与JDBC的隔离级别相对应

  • READ_UNCOMMITTED (读未提交)

    这是事务最低的隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。

  • READ_COMMITTED (读已提交)

    保证一个事务修改的数据提交后才能被另外一个事务读取,另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。

  • REPEATABLE_READ (可重复读)

    这种事务隔离级别可以防止脏读、不可重复读,但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了不可重复读。

  • SERIALIZABLE(串行化)

这是花费最高代价但是最可靠的事务隔离级别,事务被处理为顺序执行。除了防止脏读、不可重复读外,还避免了幻像读。

posted @   繁星TT  阅读(75)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示