事务管理器
2024年11月17日大约 3 分钟
spring的事务控制都是基于AOP的,它既可以使用编程的方式时间,也可以使用配置的方式实现
编程式事务
就是将业务代码和事务代码放在一起书写,耦合度太高
声明式事务
就是将事务的代码和业务代码隔离开发,然后通过一段配置让他们组装运行,最后达到事务控制的目的
API名词解析
隔离级别
隔离级别 | 含义 |
---|---|
DEFAULT | 使用数据库默认的隔离级别 |
READ_UNCOMMITTED | 可能导致脏读、幻读或不可重复读。 |
READ_COMMITTED | (Oracle 默认级别)可防止脏读,但幻读和不可重复读仍可能会发生。 |
REPEATABLE_READ | (MySQL默认级别)可防止脏读和不可重复读,但幻读仍可能发生。 |
SERIALIZABLE | 确保不发生脏读、不可重复读和幻影读。 |
传播行为
关键字 | 描述 |
---|---|
REQUIRED【默认】 | 如果有事务在运行,当前方法将会在该事务中运行。否则,会启动一个新的事务,并在自己的事务中运行 |
SUPPORTS | 如果有事务在运行,当前方法将会在该事务中运行。否则,它可以不在一个事务中运行 |
MANDATORY | 表示该方法必须在事务中运行,如果当前事务不存在,则会抛出一个异常 |
REQUERS_NEW | 表示当前方法必须运行在它自己的事务中。一个新的事务将被启动。如果存在当前事务,在该方法执行期间,当前事务会被挂起 |
NOT_SUPPORTED | 表示该方法不应该运行在事务中。如果存在当前事务,在该方法运行期间,当前事务将被挂起 |
NEVER | 表示该方法不应该运行在事务中。如果当前正有一个事务在运行,则会抛出异常 |
NESTED | 表示如果当前已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。如果当前事务不存在,那么其行为与REQUIRED一样 |
其他
关键字 | 作用 | 描述 |
---|---|---|
timeout | 超时时间 | 默认值是-1,没有超时限制。如果有,以秒为单位进行设置 |
read-only | 是否是只读事务 | 只读事务(增 删 改不能使用,只能查询使用) |
事务控制
Spring中的事务控制主要就是通过三个API实现的
PlatformTransactionManager
TransactionStatus getTransaction(TransactionDefinition definition);
功能:获取事务的状态信息void commit(TransactionStatus status);
功能:提交事务void rollback(TransactionStatus status);
功能:回滚事务
TransactionDefinition
- 获取事务对象名称 — String getName()
- 获取事务隔离级 — int getlsolationLevelf()
- 获取事务传播行为 — int getPropagationBehavior()
- 获取事务超时时间 — int getTimeoutf()
- 获取事务是否只读 — boolean isReadOnlyf()
TransactionStatus
- 刷新事务 — void flush()
- 获取是否是否存在存储点 — boolean hasSavepointf)
- 获取事务是否完成 — boolean isCompletedf)
- 获取事务是否为新的事务 — boolean isNewTransaction()
- 获取事务是否回滚 — boolean isRollbackOnlyf()
- 设置事务回滚void setRollbackOnly()
代码
maven:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
基于XML的配置
配置事务管理器
<!--配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
配置事务的规则