

【笔记】Spring实现事务
source link: https://feiju12138.github.io/2022/10/11/Spring%E5%AE%9E%E7%8E%B0%E4%BA%8B%E5%8A%A1/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Spring实现事务学习笔记
Spring的事务的核心概念
当没有开启Spring的事务时,每一个数据层方法单独开启一个独立的事务。当开启了Spring的事务后,整个业务层方法作为一个新的事务,被调用的数据层方法将加入到业务层的事务中,组成一整个事务
- 事务管理员:业务层方法管理整个方法中出现的所有事务作为事务管理员
- 事务协调员:数据层方法将自己管理的事务作为事务协调员加入到事务管理员
启动用注解的方式进行事务管理
- 在Spring核心配置类上使用
@EnableTransactionManagement
启用注解的方式进行事务管理
@EnableTransactionManagement
public class SpringConfig {
}
添加配置类
- 定义一个事务管理器对象,并将事务管理器对象交给Spring容器管理
package com.conf;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import javax.sql.DataSource;
public class JDBCConfig {
@Bean
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("");
dataSource.setUsername("");
dataSource.setPassword("");
return dataSource;
}
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(dataSource);
return transactionManager;
}
}
- 在需要添加事务处理的方法上添加
@Transactional
注解- 通常加在业务层接口的抽象方法上
- 也可以写在类或接口上,被
@Transactional
注解标注的类或接口中所有方法都会开启事务
@Transactional
:开启事务
readOnly = true
:设置为只读事务timeout = -1
:设置超时时间,-1标识用不超时rollbackFor = {NullPointException.class}
:设置事务遇到了指定异常进行回滚(类格式)rollbackForClassName = ""
:设置事务遇到了指定异常进行回滚(字符串格式)noRollbackFor = {NullPointException.class}
:设置事务遇到了指定异常不进行回滚(类格式)noRollbackForClassName = ""
:设置事务遇到了指定异常不进行回滚(字符串格式)
src/main/java/com/service/impl/UserServiceImpl.java
package com.service;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public interface UserService {
@Transactional
void method();
}
- 此时,如果方法执行出现Error异常或运行时异常将会自动回滚,如果方法执行没有出现异常才会自动提交
设置事务的传播行为
- 指定哪些事务协调员加入到事务管理员
@Transactional()
:开启事务
propagation = REQUIRED
:设置事务的传播行为
传播属性 | 事务管理员 | 事务协调员 |
---|---|---|
REQUIRED(缺省值) | 如果开启了事务 | 则加入事务 |
如果没有开启事务 | 则新建事务 | |
REQUIRES_NEW | 如果开启了事务 | 则新建事务 |
如果没有开启事务 | 则新建事务 | |
SUPPORTS | 如果开启了事务 | 则加入事务 |
如果没有开启事务 | 则不开启事务 | |
NOT_SUPPORTED | 如果开启了事务 | 则不开启事务 |
如果没有开启事务 | 则不开启事务 | |
MANDATORY | 如果开启了事务 | 则加入事物 |
如果没有开启事务 | 则抛异常ERROR | |
NEVER | 如果开启了事务 | 则抛异常ERROR |
如果没有开启事务 | 则不开启事务 |
src/main/java/com/service/UserService.java
package com.service;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class UserService {
@Transactional(propagation = REQUIRES_NEW)
public void method() {
try {
...
} finally {
...
}
}
}
- 如果想要无论是否事务是否回滚都执行日志记录,可以将事务的传播行为设置为
@Transactional(propagation = REQUIRES_NEW)
,将业务代码写在try {}
代码块,将日期记录代码写在finally {}
代码块
Recommend
-
134
Spring源码解析之事务篇 原 Spring源码解析之事务篇 张强...
-
63
分布式事务,一直是实现分布式系统过程中最大的挑战。在只有单个数据源的单服务系统当中,只要这个数据源支持事务,例如大部分关系型数据库,和一些MQ服务,如activeMQ等,我们就可以很容易的实现事务。 本地事物 ...
-
36
不知道你有没有被spring的事务困扰过,事务传播行为,事务隔离级别,aop一堆的概念袭来,要不要缴械投降?本文就来带你蹂躏这些难懂的概念,各个击破最终理解事物。Spring提供了一个事务管理接口,PlatformTransactionManager它里面提供了常用的事务操作的方法:pu...
-
22
系列文章索引: 什么是代理 理设计模式提供了对目标对象的间接访问方式,能力模式能够解耦合并且便于扩展目标的功能。 在现实生活这,我们消费者如果要去购买一杯牛奶的时候,并不是直接去找牛奶厂商购买,而是在便利店或者超市购买(...
-
3
在一个Spring Boot项目中,连接多个数据源还是比较常见的。之前也介绍了如何在几种常用框架的场景下配置多数据源,具体可见: Spring Boot 2.x基础教程:JdbcTe...
-
8
虽然日常工作需要涉及到数据库的底层部分并不多,但Postgresql作为一个数据库实现的范本是很值得研究的。可以通过它的实现来探索很多通用的数据库设计以及系统设计的理念。本文主要关注于事物设计方面。 pg底层使用MVCC,修改数据时会直接...
-
6
事务简单介绍 本文源码基于spring-framework-5.3.10。 事务是基于AOP的机制进行实现的! Spring事务基本执行原理 一个Bean在执行Bean的创建生命周期时,会经过InfrastructureAdvisorAutoProxyCreator的初...
-
10
使用Spring Boot + Kafka实现分布式事务 解道Jdon ...
-
8
万维钢 -《精英日课》为了学习而学习,大约是这么一个过程 —— 首先是撤退。你撤退到密室里,不受功名利禄影响,思考一些最根本的问题。 然后你会产生渴望。你会觉得以前的自己太幼稚了,你想要变聪明、变成好人,你想追求真理,想去谦卑地做成一些事情。...
-
2
在使用事务的时候需要添加@EnableTransactionManagement注解来开启事务,Spring事务底层是通过AOP来实现的,所以启用事务后,同样会向容器中注入一个代理对象创建器,AOP使用的是AnnotationAwareAspectJAutoProxyCreator,事务使用的是InfrastructureAdvisorAutoProx...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK