关于spring事务传播行为非事务方式的理解

目录
  • spring事务传播行为非事务方式
  • Spring事务理解和配置
    • 1 Spring事务
      • 1.1 事务简介
      • 1.2 事务的传播行为
      • 1.3 编程式事务(需要手动写代码,了解)
      • 1.4 声明式事务(xml配置)
      • 1.5 声明式事务(注解)

spring事务传播行为非事务方式

具体的隔离级别可以看看搜一下,相关的博客挺多的,现在说一下对传播行为 PROPAGATION_NOT_SUPPORTED、PROPAGATION_NEVER中很多解释为 非事务方式运行 的理解。   

关于什么是‘非事务方式运行‘问了些人,也看了spring相关解释,都没能解释的让人很明白。从字面上解释就是不在事务中运行,这种理解是不对的。在innodb这种支持事务的存储引擎中,所有的操作都是在事务中完成的。

下面截图是默认隔离级别(PROPAGATION_REQUIRED)下数据库操作的截图,在进行插入之前都会设置为非自动提交。

  

下图是never隔离级别下的数据库操作截图,可以看到在操作数据库之前设置为自动提交了。

  

demo代码如下,ps:传播行为、隔离级别生效 要在不同的类中调用(动态代理支持)

  

小结一下:非事务的方式运行,其实就是设置为自动提交了,如果一个方法中有多个操作,则每个操作都会在不同事务中完成,不会保证他们的原子性。个人理解,有啥不对 欢迎指正。

Spring事务理解和配置

1 Spring事务

1.1 事务简介

1.1.1 什么是事务

  • 事务:逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败.

1.1.2 事物的特性

  • 原子性:事务不可分割
  • 一致性:事务执行前后数据完整性保持一致
  • 隔离性:一个事务的执行不应该受到其他事物的影响
  • 持久性:一旦事务结束,数据就持久化到数据库

1.1.3 不考虑事物会引发的安全问题

  • 读问题

脏读:一个事务读到另一个事务未提交的数据

不可重复度:一个事务读到另一个事务已经提交的update的数据,导致一个事务中多次查询结果不一致.

幻读:一个事务读到另一个事务已经提交的insert的数据,导致一个事务中多次查询结果不一致

  • 写问题

丢失更新

1.1.4 事务隔离级别

  • Read uncommitted:读未提交,任何问题解决不了
  • Read committed:读已提交,解决脏读,但是不可重复度和幻读有可能发生(Oracle默认)
  • Repeatable read:重复度,解决脏读和不可重复读,但是幻读可能发生(msyql默认)
  • Serializable:序列化,解决所有读问题

1.2 事务的传播行为

Spring中提供了七种事务的传播行为:

保证多个操作在同一个事务中

  • PROPAGATION_REQUIRED:默认值,如果A中有事务,使用A中的事务,如果A没有,创建一个新的事务,将操作包含进来
  • PROPAGATION_SUPPORTS :支持事务,如果A中有事务,使用A中的事务。如果A没有事务,不使用事务。
  • PROPAGATION_MANDATORY :如果A中有事务,使用A中的事务。如果A没有事务,抛出异常。

保证多个操作不在同一个事务中

  • PROPAGATION_REQUIRES_NEW :如果A中有事务,将A的事务挂起(暂停),创建新事务,只包含自身操作。如果A中没有事务,创建一个新事务,包含自身操作。
  • PROPAGATION_NOT_SUPPORTED :如果A中有事务,将A的事务挂起。不使用事务管理。
  • PROPAGATION_NEVER :如果A中有事务,报异常。

嵌套式事务

  • PROPAGATION_NESTED :嵌套事务,如果A中有事务,按照A的事务执行,执行完成后,设置一个保存点,执行B中的操作,如果没有异常,执行通过,如果有异常,可以选择回滚到最初始位置,也可以回滚到保存点。

1.3 编程式事务(需要手动写代码,了解)

1.3.1 配置平台事务管理器

<!-- 配置平台事务管理器============================= -->
 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"/>
 </bean>

1.3.2 Spring提供了事务管理的模板类

<!-- 配置事务管理的模板 -->
 <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
  <property name="transactionManager" ref="transactionManager"/>
 </bean>

1.3.3 在业务层注入事务管理的模板

<!-- 配置Service============= -->
 <bean id="accountService" class="com.itheima.tx.demo1.AccountServiceImpl">
  <property name="accountDao" ref="accountDao"/>
  <!-- 注入 事务管理的模板 -->
  <property name="trsactionTemplate" ref="transactionTemplate"/>
 </bean>

1.3.4 编写事务管理的代码

public void transfer(final String from, final String to, final Double money) {

  trsactionTemplate.execute(new TransactionCallbackWithoutResult() {
   @Override
   protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
    accountDao.outMoney(from, money);
    int d = 1/0;
    accountDao.inMoney(to, money);
   }
  });

1.4 声明式事务(xml配置)

1.4.1 配置事务管理器

<!-- 配置事务管理器=============================== -->
 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"/>
 </bean>

1.4.2 配置增强

<!-- 配置事务的增强=============================== -->
 <tx:advice id="txAdvice" transaction-manager="transactionManager">
  <tx:attributes>
   <!-- 事务管理的规则 -->
   <!-- <tx:method name="save*" propagation="REQUIRED" isolation="DEFAULT"/>
   <tx:method name="update*" propagation="REQUIRED"/>
   <tx:method name="delete*" propagation="REQUIRED"/>
   <tx:method name="find*" read-only="true"/> -->
   <tx:method name="*" propagation="REQUIRED" read-only="false"/>
  </tx:attributes>
 </tx:advice>

1.4.3 AOP的配置

<!-- aop的配置 -->
 <aop:config>
  <aop:pointcut expression="execution(* com.itheima.tx.demo2.AccountServiceImpl.*(..))" id="pointcut1"/>
  <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/>
 </aop:config>

1.5 声明式事务(注解)

1.5.1 配置事务管理器

<!-- 配置事务管理器=============================== -->
 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"/>
 </bean>

1.5.2 开启注解事务

<!-- 开启注解事务================================ -->
 <tx:annotation-driven transaction-manager="transactionManager"/>

1.5.3 在业务层添加注解

@Transactional(isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED)
public class AccountServiceImpl implements AccountService {

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 浅谈Spring事务传播行为实战

    Spring框架提供了事务管理的标准实现,且可以通过注解或者XML文件的方式声明和配置事务. 通过异步事件的方式解耦服务调用,可以提高程序的响应速度,并且避免因为事务传播行为而导致的事务问题. 本文以一个电商平台包裹出库的业务为实际背景,通过异步事件与线程池的方式解耦嵌套事务,提高程序并发性能:为了便于问题的分析和方案的理解,同时还讲解了Spring的事务管理,并着重介绍了几种不同的事务传播行为. 事务小贴士 什么是事务呢?简单来讲事务就是逻辑上的一组操作,这些操作要么都执行,要么都不执行. 什

  • 深入理解Spring事务的传播行为

    前言 本文主要介绍下Spring事务中的传播行为.事务传播行为是Spring框架独有的事务增强特性,他不属于的事务实际提供方数据库行为.这是Spring为我们提供的强大的工具箱,使用事务传播行可以为我们的开发工作提供许多便利. 下面话不多说了,来一起看看详细的介绍吧 事务传播行为介绍 Spring中的7个事务传播行为: |事务行为|说明 | |:--|:--| |PROPAGATION_REQUIRED | 支持当前事务,假设当前没有事务.就新建一个事务 | | PROPAGATION_SUPP

  • Spring事务传播属性和隔离级别详细介绍

    1 事务的传播属性(Propagation) 1) REQUIRED ,这个是默认的属性 Support a current transaction, create a new one if none exists. 如果存在一个事务,则支持当前事务.如果没有事务则开启一个新的事务. 被设置成这个级别时,会为每一个被调用的方法创建一个逻辑事务域.如果前面的方法已经创建了事务,那么后面的方法支持当前的事务,如果当前没有事务会重新建立事务. 2) MANDATORY Support a curren

  • 基于Spring中的事务@Transactional细节与易错点、幻读

    目录 为什么要使用事务? 如何使用事务? 事务的传播带来的几种结果 两个特例 事务传播属性propagation 数据库隔离级别 1.未提交读(会有脏读的现象) 2.已提交读 3.可重复读 (有可能覆盖掉其他事务的操作) 4.串行化(没有并发操作) Spring事务隔离级别比数据库事务隔离级别多一个default ACID,事务内的一组操作具有 原子性 .一致性.隔离性.持久性. Atomicity(原子性):一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束

  • Spring中的事务传播行为示例详解

    一.背景介绍 Spring 框架应该是每一个人 javaer 都必须接触和学习的技术,Spring 公司所提供的各种框架是 Java 开发行业可参考的重要标准之一. Spring 中有 7 种类型的事务传播行为.事务传播行为是 Spring 框架提供的一种事务管理方式,它是 Spring 框架之中非常重要的一个技术点,毕竟事务关系到应用程序和数据库的交互,而数据更是互联网行业最为重要的资源. 平时开发过程中事务都会有使用,但是没有真正地总结过,尤其是事务中嵌套事务的场景,此篇基础知识文在此做一个

  • 关于spring事务传播行为非事务方式的理解

    目录 spring事务传播行为非事务方式 Spring事务理解和配置 1 Spring事务 1.1 事务简介 1.2 事务的传播行为 1.3 编程式事务(需要手动写代码,了解) 1.4 声明式事务(xml配置) 1.5 声明式事务(注解) spring事务传播行为非事务方式 具体的隔离级别可以看看搜一下,相关的博客挺多的,现在说一下对传播行为 PROPAGATION_NOT_SUPPORTED.PROPAGATION_NEVER中很多解释为 非事务方式运行 的理解.    关于什么是'非事务方式

  • 深入理解Spring的事务传播行为

    前言 Spring在TransactionDefinition接口中规定了7种类型的事务传播行为.事务传播行为是Spring框架独有的事务增强特性,他不属于的事务实际提供方数据库行为.这是Spring为我们提供的强大的工具箱,使用事务传播行可以为我们的开发工作提供许多便利.但是人们对他的误解也颇多,你一定也听过"service方法事务最好不要嵌套"的传言.要想正确的使用工具首先需要了解工具.本文对七种事务传播行为做详细介绍,内容主要代码示例的方式呈现. 基础概念 1. 什么是事务传播行

  • 老生常谈spring的事务传播机制

    目录 spring的事务传播机制 1.why 为什么会有事务传播机制? 2.传播机制生效的条件 解决方案 3.传播机制类型 PROPAGATION_REQUIRED (默认) REQUIRES_NEW (一般用在子方法需要单独事务) NESTED SUPPORTS NOT_SUPPORTED MANDATORY NEVER spring的事务传播机制 背景:实习期间几次遇到事务方法,有一次本地测试时发现事务没有回滚,就把简单描述写在wx上,今天来给spring事务做个自我总结. 1.why 为什

  • 深入了解Spring的事务传播机制

    目录 Spring 事务传播机制有哪些? 事务传播机制使用与演示 REQUIRED 使用演示 REQUIRED_NEW 使用演示 NESTED 使用演示 总结 Spring 事务传播机制是指,包含多个事务的方法在相互调用时,事务是如何在这些方法间传播的. 既然是“事务传播”,所以事务的数量应该在两个或两个以上,Spring 事务传播机制的诞生是为了规定多个事务在传播过程中的行为的.比如方法 A 开启了事务,而在执行过程中又调用了开启事务的 B 方法,那么 B 方法的事务是应该加入到 A 事务当中

  • Spring超详细讲解事务和事务传播机制

    目录 为什么需要事务 Spring 声明事务 Transactional参数说明 propagation isolation timeout 事务回滚失效解决方案 @Transactional工作原理 Spring 事务的传播机制 为什么需要事务传播机制? 传播机制的类型 为什么需要事务 事务是将一组操作封装成一个执行单元,要么全部成功,要么全部失败.如果没有事务,转账操作就会出现异常,因此需要保证原子性. Spring 声明事务 只需要在方法上添加@Transactional注解就可以实现,无

  • spring 整合JDBC和AOP事务的方法

    spring整合JDBC spring提供了很多模板整合Dao技术 ORM持久化技术 模板类 JDBC org.springframework.Jdbc.core.JdbcTemplate Hibernate3.0 org.springframework.orm.hiberate3.HibernateTemplate IBatis(MyBatis) org.springframework.orm.sqlMapClientTemplate JPA org.springframework.orm.j

  • 详解Spring学习之声明式事务管理

    前言 在前面的小节中,我们学习了关于事务的概念以及事务管理的重要性,并且通过编程使用Spring的编程式事务管理进行操作,加深对事务管理的重要性的学习,不过,由于编程式的事务管理使用起来不是很方便,所以在日常的开发中基本不怎么使用,接下来的内容我们将学习使用Spring的声明式事务管理,这里有一个地方需要明白的是,Spring的声明式事务管理的实现方式其实是通过AOP的方式来实现的,也就是为原始的事务管理对象创建代理对象,从而实现事务管理增强的 基于TransactionProxyFactory

随机推荐