首页 > 其他分享 >spring事务

spring事务

时间:2022-12-19 13:44:14浏览次数:42  
标签:事务 隔离 propagation spring Propagation 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(串行化)

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

标签:事务,隔离,propagation,spring,Propagation,Spring,级别
From: https://www.cnblogs.com/microstar/p/16991942.html

相关文章

  • Spring Cloud构建微服务架构(二)服务消费者
     NetflixRibbonisanInterProcessCommunication(IPC)cloudlibrary.Ribbonprimarilyprovidesclient-sideloadbalancingalgorithms.Apartfromtheclient-si......
  • Spring CredHub 教程学习
    SpringCredHub提供客户端支持,用于从CloudFoundry​平台中运行的CredHub服务器存储,检索和删除凭据。CredHub提供了一个HTTPAPI,用于安全地存储,生成,检索和删除各种类型的凭......
  • Spring LDAP参考
    SpringLDAP使得构建使用LightweightDirectoryAccess协议的基于Spring的应用程序变得更加容易。本文档的副本可以制作供您自己使用和分发给他人,前提是您不对此类副本......
  • Spring提取@Transactional事务注解的源码解析
    声明:本文是自己在学习spring注解事务处理源代码时所留下的笔记;难免有错误,敬请读者谅解!!!1、事务注解标签<tx:annotation-driven/>2、tx命名空间解析器 事务tx命名空间解析......
  • springboot+postgresql集成anyline试水
    anyline是什么简单讲就是一个工具可以让你抛开常规的机械性建mapper、dao、sql,用通用的语句查询和操作数据库表。目前也在初步探索中,感受还不深。官网文档:http://doc.any......
  • 5. MinIO与springboot的集成
    MinIO与springboot的集成搭建一个springboot的项目,集成MinIO实现文件的管理。一、搭建springboot环境IntelliJIDEAJDK17gradle-7.5.1springboot2.7.6项目地址:g......
  • Spring Cloud 应用 Proxyless Mesh 模式探索与实践
    作者:十眠ServiceMesh简介ServiceMesh早已不是一个新兴的概念,目前已经有许多关于ServiceMesh的探索以及实践。2016年可以说是ServiceMesh的元年,Buoyant公司CEO......
  • Spring AMQP项目(四)
    4.1.12.代理事件侦听器启用事件交换插件后,如果将类型的Bean添加到应用程序上下文中,它将选定的代理事件发布为实例,这些实例可以使用普通的Spring或方法使用。事件由代......
  • Spring Cloud 应用 Proxyless Mesh 模式探索与实践
    作者:十眠ServiceMesh简介ServiceMesh早已不是一个新兴的概念,目前已经有许多关于ServiceMesh的探索以及实践。2016年可以说是ServiceMesh的元年,Buoyant公司......
  • Spring boot —— 创建parent工程
    方式一<parent>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter-parent</artifactId>      <versio......