欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > [spring]spring事务和事务传播机制

[spring]spring事务和事务传播机制

2025/11/12 3:22:21 来源:https://blog.csdn.net/m0_73992740/article/details/142851837  浏览:    关键词:[spring]spring事务和事务传播机制

文章目录

  • 一. 事务
  • Spring中的事务实现
    • 编程式事务
    • 声明式事务@Transactional
    • @Transactional作用
  • @Transactional详解
    • 1. rollbackFor
    • 2. 事务隔离级别
      • mysql事务隔离级别
      • Spring事务隔离级别
    • 3. 事务传播机制
      • 什么是事务传播机制
      • 事务传播机制有哪些
      • Spring事务传播机制使用
        • REQUIRED(加入事务)
        • REQUIRES_NEW(新建事务)
        • NEVER(不支持当前事务,抛异常)
        • NESTED(嵌套事务)

一. 事务

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Spring中的事务实现

在这里插入图片描述

编程式事务

在这里插入图片描述
在这里插入图片描述
提交:

@RequestMapping("/user")
@RestController
public class UserController {//JDBC事务管理器@Autowiredprivate DataSourceTransactionManager dataSourceTransactionManager;//定义事务属性@Autowiredprivate TransactionDefinition transactionDefinition;@Autowiredprivate UserInfoService userInfoService;@RequestMapping("/registry")public String registry(String name, String password){//开启事务TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);//用户注册userInfoService.registryUser(name,password);//提交事务dataSourceTransactionManager.commit(transactionStatus);return "注册成功";}
}

在这里插入图片描述
在这里插入图片描述

回滚:
在这里插入图片描述

在这里插入图片描述
数据库中并没有添加

声明式事务@Transactional

添加依赖:

<dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId></dependency>

在这里插入图片描述

添加注解:

@RequestMapping("/user")
@RestController
public class UserController {@Autowiredprivate UserInfoService userInfoService;@Transactional@RequestMapping("/registry")public String registry(String name, String password) {userInfoService.registryUser(name, password);return "注册成功";}

在这里插入图片描述
抛出异常:
在这里插入图片描述
在这里插入图片描述
事务回滚, 没有提交, 数据库没有添加数据

@Transactional作用

在这里插入图片描述
在这里插入图片描述
异常被捕获住:
在这里插入图片描述
在这里插入图片描述
会提交

如果想要异常被捕获了, 但是事务依然回滚, 有两种方式:

  1. 重新抛出异常
    在这里插入图片描述
  2. 手动回滚事务
    在这里插入图片描述
    在这里插入图片描述

@Transactional详解

在这里插入图片描述
在这里插入图片描述

1. rollbackFor

@Transactional默认只在遇到运行时异常RuntimeException和Error时才会回滚, 非运行时异常不回滚
在这里插入图片描述
如果我们需要让所有异常都回滚, 需要配置@Transactional注解中的rollbackFor属性, 通过rollbackFor这个属性指定出现何种异常类型时事务进行回滚
在这里插入图片描述
在这里插入图片描述

2. 事务隔离级别

mysql事务隔离级别

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Spring事务隔离级别

在这里插入图片描述
在这里插入图片描述
Spring事务隔离级别可以通过@Transactional中的isolation属性进行设置
在这里插入图片描述

3. 事务传播机制

什么是事务传播机制

事务传播机制就是:多个事务⽅法存在调⽤关系时,事务是如何在这些⽅法间进⾏传播的
在这里插入图片描述
事务隔离级别是解决多个书屋同时调用一个数据库的问题
在这里插入图片描述

事务传播机制解决的是一个事务在多个节点(方法)中的传递问题
在这里插入图片描述

事务传播机制有哪些

@Transactinal注解致辞书屋传播是指的设置, 通过propagation属性来指定传播行为
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Spring事务传播机制使用

REQUIRED(加入事务)

在这里插入图片描述

@RestController
@RequestMapping("/propaga")
public class PropagationController {@Autowiredprivate UserInfoService userInfoService;@Autowiredprivate LogInfoService logInfoService;@RequestMapping("/r1")@Transactional(propagation = Propagation.REQUIRED)public String r1(String name, String password){//用户注册userInfoService.registryUser(name, password);//记录操作日志logInfoService.insertLog(name, "用户注册");return "r1";}
}@Service
public class UserInfoService {@Autowiredprivate UserInfoMapper userInfoMapper;@Transactional(propagation = Propagation.REQUIRED)public void registryUser(String name, String password){userInfoMapper.insert(name, password);}
}@Service
public class LogInfoService {@Autowiredprivate LogInfoMapper logInfoMapper;@Transactional(propagation = Propagation.REQUIRED)public void insertLog(String name, String op){//出现异常int a = 10/0;logInfoMapper.insertLog(name,op);}
}

在这里插入图片描述
只创建了一个事务, 并且事务并没有提交, 数据库中也没有更新数据

流程描述:

  1. r1⽅法开始事务
  2. ⽤⼾注册,插⼊⼀条数据(执⾏成功)(和r1使⽤同⼀个事务)
  3. 记录操作⽇志,插⼊⼀条数据(出现异常,执⾏失败)(和r1使⽤同⼀个事务)
  4. 因为步骤3出现异常,事务回滚.步骤2和3使⽤同⼀个事务,所以步骤2的数据也回滚了
REQUIRES_NEW(新建事务)

将事务传播机制改成Propagation.REQUIRES_NEW
在这里插入图片描述
用户数据插入成功, 日志表数据发生异常, 插入失败
在这里插入图片描述

NEVER(不支持当前事务,抛异常)

在这里插入图片描述
在这里插入图片描述

程序执行报错
在这里插入图片描述

NESTED(嵌套事务)

在这里插入图片描述
在这里插入图片描述
r1事务可以认为是⽗事务,嵌套事务是⼦事务.⽗事务出现异常,⼦事务也会回滚,⼦事务出现异常,如
果不进⾏处理,也会导致⽗事务回滚

在这里插入图片描述

NESTED和REQUIRED的区别
在LogInfoService中进行捕获异常, 并进行当前事务回滚
在这里插入图片描述
在这里插入图片描述
发现 用户表提交成功, 但是日志表提交失败
由于LogInfoService已经捕获了异常, 所以不会导致r1父事务回滚, r1正常提交
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词