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

[笔记]事务简介-springboot

在Spring Boot中,事务的管理通常通过注解来实现,使得配置变得简单而直观。这种方式与Spring Boot的设计理念一致,即减少显式配置,增加自动配置。以下是如何在Spring Boot项目中应用和管理事务的详细说明:


Spring Boot中的事务管理

  1. Spring Boot事务基础

Spring Boot沿用了Spring的事务管理概念,但在配置和使用上更为简化,主要依赖于注解来管理事务。

1.1. Spring Boot事务特性

与传统的Spring事务管理相同,Spring Boot事务也遵循ACID原则:

  1. 原子性(Atomicity)

  2. 一致性(Consistency

  3. 隔离性(Isolation)

  4. 持久性(Durability)

1.2. 事务的隔离级别和传播行为

Spring Boot支持相同的事务隔离级别和传播行为,如:

  • 隔离级别:READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、SERIALIZABLE。

  • 传播行为:REQUIRED、REQUIRES_NEW、SUPPORTS等。

  1. Spring Boot中的声明式事务

2.1. 开启事务支持

在Spring Boot中,通常通过添加@EnableTransactionManagement注解在配置类上启用事务管理,但在Spring Boot中这通常是不必要的,因为Spring Boot的自动配置已经包含了事务管理的支持。

2.2. 使用@Transactional注解
  • @Transactional:这是控制事务的主要注解。它可以应用于类或方法上。当应用于类上时,该类的所有公共方法将成为事务方法。

  • 属性配置:可以配置如下属性:

    • propagation:定义事务的传播行为。

    • isolation:定义事务的隔离级别。

    • timeout:定义事务的超时时间。

    • readOnly:标记事务是否为只读。

    • rollbackFor:定义哪些异常类型会触发事务回滚。

    • noRollbackFor:定义哪些异常类型不会触发事务回滚。

  1. 示例代码

3.1. Service层事务应用
@Service
public class UserServiceImpl implements UserService {@Transactional(rollbackFor = Exception.class)public void createUser(User user) {// 方法实现}@Transactional(readOnly = true)public User getUserById(Long id) {// 方法实现}
}

在这个例子中,createUser方法上的@Transactional注解指定了在发生任何Exception时回滚事务。而getUserById方法则是一个只读事务,这对于提高查询操作的效率是有帮助的。

3.2. 自定义事务管理器

如果您需要自定义事务管理器,可以在配置类中定义:

@Configuration
public class TransactionConfig {@Beanpublic PlatformTransactionManager transactionManager(DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}
}

在大多数情况下,您不需要这样做,因为Spring Boot会为您自动配置事务管理器。

  1. 事务不生效的情况

同样地,在Spring Boot中,如果在同一个类中,一个没有使用事务的方法调用了一个使用了事务的方法,事务是不会生效的。这是因为事务的应用需要通过代理来实现,而直接的方法调用不会经过代理。

此外,对于声明式事务,Spring默认只对运行时异常进行回滚。如果需要对检查型异常进行回滚,可以通过@Transactional注解的rollbackFor属性来指定。


以上就是在Spring Boot项目中关于事务管理的主要内容。Spring Boot使得事务管理变得更加

简单,减少了大量的配置工作,同时保留了Spring事务管理的灵活性和强大功能。

传播行为

传播行为是指在事务环境中,方法之间相互调用时事务如何传播。例如,当一个事务方法被另一个事务方法调用时,是否要加入已存在的事务,或者创建一个新的事务等。

在Spring和Spring Boot中,有几种不同的传播行为,例如REQUIRED(如果当前存在事务,就加入该事务;如果没有,则创建一个新的事务)和REQUIRES_NEW(总是创建一个新的事务)等。了解和合理使用这些传播行为对于设计正确的事务策略是非常重要的。

this. 调用和事务失效问题

在Spring和Spring Boot中,事务是通过AOP代理实现的。当在同一个类中,一个非事务方法内部调用了一个事务方法时,这种this.的调用方式将直接调用方法,而不会通过代理,导致事务处理失效。

解决这个问题的一种方法是使用Spring的自我注入。即在类内部使用@Autowired@Resource将自己注入进来,然后通过这个注入的实例调用事务方法,以确保通过代理:

@Service
public class MyService {@Autowiredprivate MyService myService; // 自我注入public void nonTransactionalMethod() {myService.transactionalMethod(); // 通过代理调用}@Transactionalpublic void transactionalMethod() {// 事务处理}
}

抛出非运行时异常导致的事务不回滚

在Spring的声明式事务管理中,默认情况下,只有在抛出运行时异常(继承自RuntimeException)和错误(Error)时,事务才会回滚。如果需要让检查型异常(即非运行时异常,如SQLException)也触发事务回滚,可以通过@Transactional注解的rollbackFor属性来实现:

@Transactional(rollbackFor = Exception.class)
public void someTransactionalMethod() {// 业务逻辑
}

在这里,将rollbackFor属性设置为Exception.class意味着所有类型的异常,包括非运行时异常,都会触发事务回滚。

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

相关文章:

  • 初识计算机网络 | 计算机网络的发展 | 协议初识
  • 【sgTree】自定义组件:加载el-tree树节点整棵树数据,实现增删改操作。
  • vue2面试题:vue组件之间的通信方式有哪些?
  • Pytorch神经网络模型nn.Sequential与nn.Linear
  • C++-gdb调试常用功能
  • 快速上手的AI工具-文心一言辅助学习
  • Boost 适用 filesystem 库,statx 函数无法找到引用问题的解决方案。
  • MyBatis中一级缓存是什么?SqlSession一级缓存失效的原因?如何理解一级缓存?
  • 项目解决方案:多地医馆的高清视频监控接入汇聚联网
  • 【前端基础--2】
  • 【GitHub项目推荐--提取文字】【转载】
  • WebSocket与Shiro认证信息传递的实现与安全性探讨
  • QT 实现自动生成小学两位数加减法算式
  • 小程序学习-20
  • 面试题-【消息队列】
  • 【江科大】STM32:I2C通信外设(硬件)
  • 【机器学习300问】15、什么是逻辑回归模型?
  • C#调用C动态链接库
  • 前端实现转盘抽奖 - 使用 lucky-canvas 插件
  • 2024.1.23力扣每日一题——最长交替子数组
  • C语言王道练习题第七周两题
  • 某马头条——day11+day12
  • springboot实现aop
  • Golang 中高级工程师学习笔记
  • USB-C接口给显示器带来怎样的变化?
  • 写一份简单的产品说明书:格式和排版建议
  • 【Python学习】Python学习21- 正则表达式(1)
  • Docker 和 Kubernetes:容器化时代的崛起与演变
  • 美易官方京东养车回应索赔事件:推动行业健康发展并携手品牌商家加码补贴
  • 深度学习与图像描述生成——看图说话(3)