Spring事务
Spring 事务
主要是使用注解 开启事务只需配置好文件后在要开启事务的方法上加上@Transactional即可
注解使用步骤
导入依赖
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency>
配置
- 注册DataSourceTransactionManager
- 开启事务注解支持
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <bean id="transactionManager"▋ class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource" /> <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/> </beans>
为什么说事务使用在业务层
- 业务层是多个查询同时满足来完成一个业务 需要同时完成 如果不完成需要回滚保证数据库数据的安全 在控制层完成多个业务 单个的业务失败不影响其他业务不需要回滚
@Transactional注解 主要属性
Propagation
可选值 | |
---|---|
REQUIRED | 默认值 表示如果有事务就加入事务, 没有就开启事务 |
REQUIRES_NEW | 表示不管有没有事务,都去开启新的事务 |
NESTED | 如果有事务, 在创建一个子事务,子事务跟主事务一起提交,如果没有父事务,在开启一个新的事务 |
MANDATORY | 表示必须在一个已有的事务中使用,否则直接异常 |
SUPPORTS | 如果其他类的事务方法调用了该方法,如果调用类的方法开启了事务就使用事务,否则就不用事务 |
NOT_SUPPORTED | 不开启事务 |
NEVER | 必须在没有事务的方法使用,否则直接抛异常 |
Isolation
事务的隔离级别
隔离级别 | 名称 | 含义 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|---|---|
读未提交 | ISOLATION_READ_UNCOMMITTED | T1读取T2未提交的东西 | V | V | V |
读已提交 | ISOLATION_READ_COMMITTED | mysql默认,事务提交后可读 | X | V | V |
可重复读 | ISOLATION_REPEATABLE_READ | 针对update操作;会出现幻读现象,幻读针对的是insert操作 | X | X | V |
串行化 | ISOLATION_SERIALIZABLE | 解决了脏读、不可重复读和幻读,但是效率比较低 | X | X | X |
rollbackFor
指定抛出异常回滚
timeout
事务执行的超时时间
建议如果没有特殊要求,一般不要设置超过10s 3-5s
事务
在业务抛出异常
代码业务的严谨性
Spring 事务会失效
- Spring Spring mvc 重复扫描导致事务
- 方法没有使用public声明
- mysql必须使用引擎必须必须使用InnoDB
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!