SpringBoot手动提交事务

简介: SpringBoot手动提交事务


  • 一般情况下都是用的注解的方式来进行事务的控制
  • 基于spring的7种事务控制方式来进行事务的之间的协调
  • spring的7中事务传播行为
Propagation.REQUIRED 代表当前方法支持当前的事务,且与调用者处于同一事务上下文中,回滚统一回滚(如果当前方法是被其他方法调用的时候,且调用者本身即有事务),如果没有事务,则自己新建事务,
Propagation.SUPPORTS 代表当前方法支持当前的事务,且与调用者处于同一事务上下文中,回滚统一回滚(如果当前方法是被其他方法调用的时候,且调用者本身即有事务),如果没有事务,则该方法在非事务的上下文中执行
Propagation.MANDATORY 代表当前方法支持当前的事务,且与调用者处于同一事务上下文中,回滚统一回滚(如果当前方法是被其他方法调用的时候,且调用者本身即有事务),如果没有事务,则抛出异常
Propagation.REQUIRES_NEW 创建一个新的事务上下文,如果当前方法的调用者已经有了事务,则挂起调用者的事务,这两个事务不处于同一上下文,如果各自发生异常,各自回滚
Propagation.NOT_SUPPORTED 该方法以非事务的状态执行,如果调用该方法的调用者有事务则先挂起调用者的事务
Propagation.NEVER 该方法以非事务的状态执行,如果调用者存在事务,则抛出异常
Propagation.NESTED 如果当前上下文中存在事务,则以嵌套事务执行该方法,也就说,这部分方法是外部方法的一部分,调用者回滚,则该方法回滚,但如果该方法自己发生异常,则自己回滚,不会影响外部事务,如果不存在事务,则与PROPAGATION_REQUIRED一样

  • 事务四大特性
    a. 原子性(Atomicity)
      原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。
    b. 一致性(Consistency)
      一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说 一个事务执行之前和执行之后都必须处于一致性状态。
    c. 隔离性(Isolation)
      隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
    d. 持久性(Durability)
      持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
  • MySQL事务的隔离级别

脏读 是指在一个事务处理过程里读取了另一个未提交的事务中的数据。(读取未提交的数据)

不可重复读 是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。(边读边写)

幻读 指两个事务同时发生,两个事务修改数据,读到的数据不是自己开始修改的数据。幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体。(同时写,同时读)

  • 查看数据库事务级别
-- 查看级别
select @@tx_isolation;

数据库事务级别,默认使用Repeatable read级别,列表级别从下往上级别越低。

编程式的事务管理

  • spring的jdbc框架中提供的事务管理方式
@Autowired
private PlatformTransactionManager platformTransactionManager;
@Autowired
private TransactionDefinition transactionDefinition;
  • 编写代码
TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);
platformTransactionManager.commit(transactionStatus);
platformTransactionManager.rollback(transactionStatus);

编程式的事务控制尽量少用,因为控制程度上面来说spring的注解方式还是来的更加不错,编程式的方式,更多用于在需要事务的时候,没有办法加入事务,才采取手动控制事务的方式。

@Autowired
private PlatformTransactionManager platformTransactionManager;
@Autowired
private TransactionDefinition transactionDefinition;
public void test(){
    TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);
    UserIntegralInfo info = new UserIntegralInfo();
    info.setUserId(1L);
    info.setPoint(1);
    info.setOp("");
    info.setCurrIntegral(1);
    integralMapper.insert(info);
    platformTransactionManager.commit(transactionStatus);
    throw new RuntimeException();
}


相关文章
|
10月前
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——Spring Boot 事务配置
本文介绍了 Spring Boot 中的事务配置与使用方法。首先需要导入 MySQL 依赖,Spring Boot 会自动注入 `DataSourceTransactionManager`,无需额外配置即可通过 `@Transactional` 注解实现事务管理。接着通过创建一个用户插入功能的示例,展示了如何在 Service 层手动抛出异常以测试事务回滚机制。测试结果表明,数据库中未新增记录,证明事务已成功回滚。此过程简单高效,适合日常开发需求。
1434 0
|
XML Java 关系型数据库
Spring Boot 异常处理回滚事务详解(自动回滚、手动回滚、部分回滚)
Spring Boot 异常处理回滚事务详解(自动回滚、手动回滚、部分回滚)
4041 0
|
安全 Java easyexcel
【二十七】springboot实现多线程事务处理
【二十七】springboot实现多线程事务处理
961 0
|
前端开发 easyexcel Java
Java+EasyExcel实现文件导入导出,导入导出如此简单
项目中需要Excel文件的导入与导出Excel并下载,例如,导入员工信息,导出员工信息,手动输入比较繁琐,所以本篇博文教大家如何在Java中导入Excel文件与导出Excel文件
15893 3
Java+EasyExcel实现文件导入导出,导入导出如此简单
|
JavaScript Java 关系型数据库
Spring事务失效的8种场景
本文总结了使用 @Transactional 注解时事务可能失效的几种情况,包括数据库引擎不支持事务、类未被 Spring 管理、方法非 public、自身调用、未配置事务管理器、设置为不支持事务、异常未抛出及异常类型不匹配等。针对这些情况,文章提供了相应的解决建议,帮助开发者排查和解决事务不生效的问题。
2259 1
|
XML JSON Java
springboot文件上传,单文件上传和多文件上传,以及数据遍历和回显
本文介绍了在Spring Boot中如何实现文件上传,包括单文件和多文件上传的实现,文件上传的表单页面创建,接收上传文件的Controller层代码编写,以及上传成功后如何在页面上遍历并显示上传的文件。同时,还涉及了`MultipartFile`类的使用和`@RequestPart`注解,以及在`application.properties`中配置文件上传的相关参数。
springboot文件上传,单文件上传和多文件上传,以及数据遍历和回显
解析Spring Boot中的事务管理机制
解析Spring Boot中的事务管理机制
|
Java API 数据库
SpringBoot - 优雅的处理【长事务】
SpringBoot - 优雅的处理【长事务】
511 0
|
IDE Java 开发工具
【Java】已解决java.lang.NoClassDefFoundError异常
【Java】已解决java.lang.NoClassDefFoundError异常
6082 0
|
存储 消息中间件 Java
深入理解Spring的TransactionSynchronizationManager
深入理解Spring的TransactionSynchronizationManager
2167 0