Springboot之事物处理

一、什么是事物?
理解事务之前,先讲一个你日常生活中最常干的事:取钱。
例如 ATM 机:用户把钱从一个银行账号转账至另一个银行账号,这种操作不能被部分完成。
如转的过程中 1卡钱被相应扣除,2卡在存中,这时机器出现故障,转账被取消。取消的同时,即要事物回滚,回到1卡原有的状态。
事务就是用来解决类似问题的。事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败的话,那么事务就会回滚到最开始的状态,仿佛什么都没发生过一样。
在企业级应用程序开发中,事务管理必不可少的技术,用来确保数据的完整性和一致性。

事务有四个特性:ACID
1、原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。
2、一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。
3、隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
4、持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。

二、配置事物管理器
第一种:在Spring Boot中,当我们使用了spring-boot-starter-jdbc或spring-boot-starter-data-jpa依赖的时候,框架会自动默认分别注入DataSourceTransactionManager或JpaTransactionManager。所以我们不需要任何额外配置就可以用@Transactional注解进行事务的使用。
第二种:如果不使用第一种的话,从Spring配置入口,配置事物管理器,如下图所示:
**(明天加上图片)**

事务的配置,就是在mybatis的基础上加上两个注解。
1、需要的注解为@EnableTransactionManagement 和@Transactional 两个,它们来自于下边这个包:
spring-tx.jar

该包其实在前边配置mybatis引入依赖时,已自动引入,就是下边这个:
**(明天加上图片)**
所以只要上边的依赖引入进来,那事务就不需要再引入包了。

2.首先,找到你在这里插入图片描述的service实现类,加上@Transactional 注解,如果你加在类上,那该类所有的方法都会被事务管理,如果你加在方法上,那仅仅该方法符合具体的事务。当然我们一般都是加在方法上。因为一般只有增、删、改才会需要事务。

3.配置完后,spring boot启动类必须要开启事务,而开启事务用的注解就是@EnableTransactionManagement ,如下:
****(明天加上图片)****
三、用法

@Transactional 可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。

虽然 @Transactional 注解可以作用于接口、接口方法、类以及类方法上,但是 Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。另外, @Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。如果你在 protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。

默认情况下,只有来自外部的方法调用才会被AOP代理捕获,也就是,类内部方法调用本类内部的其他方法并不会引起事务行为,即使被调用方法使用@Transactional注解进行修饰。

敲黑板~~喵喵~看完之后,可以点赞或者评论鼓励一下老妹 抱拳,后续会分享更多的收藏的资源或者是自己平常开发遇到的经验给大家,不好的地方还望大神们指点 抱拳,共同进步!!fighting~

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 中的复杂事务处理通常涉及到 Spring Framework 的 @Transactional 注解以及一些高级特性。在 Spring Boot 应用中,你可以通过以下几个步骤来管理复杂的事务: 1. **开启事务管理**:首先需要配置数据源并启用 Spring 的 Transaction Management。在 application.properties 或 application.yml 文件中设置 `spring.transaction-manager` 和 `spring.datasource.platform` 等属性。 2. **@Transactional注解**:在需要进行事务控制的方法上添加 @Transactional 注解。可以指定 isolation、propagation、rollback-for 和 no-rollback-for 属性来定制事务行为。例如: ```java @Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED) public void complexTransactionMethod() { // 事务操作 } ``` 3. **传播行为**:Propagation 类型决定了当前方法如何处理事务,如 PROPAGATION_REQUIRED(如果存在事务则加入,若无则新建),PROPAGATION_REQUIRES_NEW(总是新建一个新的事务),等等。 4. **保存点**:Spring 提供了 savepoint 功能,可以在事务中间创建一个检查点,以便回滚到这个点而不是整个事务。 5. **嵌套事务**:在方法内部再次使用 @Transactional 可以创建嵌套事务,外部事务失败时,嵌套事务不会自动回滚。 6. **异常处理**:使用 rollback-on-method-exception 或者自定义异常处理器(@ExceptionHandler)来确定哪些异常会触发回滚。 7. **声明式事务**:除了基于方法的显式事务控制外,还可以使用声明式事务管理(比如 JPA 的 @EntityListeners 和 @PostFlush)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值