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

浙公网安备 33010602011771号