当前位置: 首页 > news >正文

Spring的事务传播行为

文章目录

    • 说一下Spring的事务传播行为

今天来和大家聊聊spring中使用的事务传播行为,

说一下Spring的事务传播行为

spring事务的传播行为说的是,当多个事务同时存在的时候,spring如何处理这些事务的行为。

① PROPAGATION_REQUIRED默认的事务传播,如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。

② PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。

③ PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。

④ PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。

⑤ PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

⑥ PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。

⑦ PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性执行。

在一个事务执行的过程中,调用另一个事务时候(比如一个service方法调用另一个service方法),这个事务将以何种状态存在,是两个事务共存呢,还是一个事务是另一个事务的子事务,还是一个事务加入另一个事务的子事务呢……利用事务的传播性来解决这个问题。

​ 1、REQUIRED: spring默认的事务的传播性
REQUIRED 表示如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。

@Service
public class AccountService {@AutowiredJdbcTemplate jdbcTemplate;@Transactionalpublic void handle1() {jdbcTemplate.update("update user set money = ? where id=?;", 1, 2);}
}
@Service
public class AccountService2 {@AutowiredJdbcTemplate jdbcTemplate;@AutowiredAccountService accountService;public void handle2() {jdbcTemplate.update("update user set money = ? where username=?;", 1, "zhangsan");accountService.handle1();}
}

如果 handle2 方法本身是有事务的,则 handle1 方法就会加入到 handle2 方法所在的事务中,这样两个方法将处于同一个事务中,一起成功或者一起失败(不管是 handle2 还是 handle1 谁抛异常,都会导致整体回滚)。

如果 handle2 方法本身是没有事务的,则 handle1 方法就会自己开启一个新的事务。

2、REQUIRES_NEW
​ REQUIRES_NEW 表示创建一个新的事务,如果当前存在事务,则把当前事务挂起。换言之,不管外部方法是否有事务,REQUIRES_NEW 都会开启自己的事务。

3、NESTED
​ NESTED 表示如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于 TransactionDefinition.PROPAGATION_REQUIRED。

4、MANDATORY
​ MANDATORY 表示如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。

5、SUPPORTS
​ NOT_SUPPORTED 表示以非事务方式运行,如果当前存在事务,则把当前事务挂起。

6、NOT_SUPPORTED
​ NOT_SUPPORTED 表示以非事务方式运行,如果当前存在事务,则把当前事务挂起。

7、NEVER
​ NEVER 表示以非事务方式运行,如果当前存在事务,则抛出异常。

http://www.lryc.cn/news/252437.html

相关文章:

  • 04_网络编程
  • 【五分钟】熟练使用numpy.cumsum()函数(干货!!!)
  • 由11月27日滴滴崩溃到近两个月国内互联网产品接二连三崩溃引发的感想
  • Python按要求从多个txt文本中提取指定数据
  • DFT新手教程:VASP中ISIF取值设置
  • pytest自动化框架之allure测试报告的用例描述设置
  • 在编程中遇到的问题总结
  • 【数据库设计和SQL基础语法】--SQL语言概述--SQL的基本结构和语法规则(二)
  • easyexcel多级表头导出各级设置样式(继承HorizontalCellStyleStrategy实现)
  • QMLfor python pyside6
  • 几何教学工具 Sketchpad几何画板 mac软件特色
  • 华清远见嵌入式学习——C++——作业5
  • Java中的类与类之间的关系
  • 全新仿某度文库网站源码/在线文库源码/文档分享平台网站源码/仿某度文库PHP源码
  • HTTPS的安全问题及应对方案
  • TensorRT-LLM保姆级教程(一)-快速入门
  • 使用Redis构建简易社交网站(3)-状态与信息流
  • Python,非二进制的霍夫曼编码
  • 详解—[C++数据结构]—红黑树
  • 甘草书店记:6# 2023年10月31日 星期二 「梦想从来不是一夜之间实现的」
  • 基于Java SSM车辆租赁管理系统
  • 侯捷C++八部曲(一,面向对象)
  • 《数据库系统概论》学习笔记——王珊 萨师煊
  • 关于使用百度开发者平台处理语音朗读问题排查
  • 安全认证 | CISP和CISP-PTE的区别在哪里?
  • Unity3D 导出的apk进行混淆加固、保护与优化原理(防止反编译)
  • C语言扫雷小游戏
  • 用取样思想一探AIX上进程性能瓶颈
  • 分布式搜索引擎elasticsearch(二)
  • Tecplot绘制涡结构(Q准则)