Spring的声明性事务是通过注解@Transactional来实现的。在该注解类中定义了事务的属性,可以通过修改这些属性来控制应用中的事务。
事务的传播类型
| 事务传播类型定义 | 传播类型描述 |
|---|---|
| PROPAGATION_REQUIRED | 支持当前事务,若当前不存在事务则创建一个新事务。Spring的默认传播类型。 |
| PROPAGATION_SUPPORTS | 支持当前事务,若当前不存在事务则以非事务的方式执行。 |
| PROPAGATION_MANDATORY | 支持当前事务,若当前不存在事务则抛出异常。 |
| PROPAGATION_REQUIRES_NEW | 创建一个新事务,若当前存在事务则挂起当前事务。 |
| PROPAGATION_NOT_SUPPORTED | 不支持当前事务,始终以非事务的方式执行。 |
| PROPAGATION_NEVER | 不支持当前事务,若当前存在事务则抛出异常。 |
| PROPAGATION_NESTED | 若当前存在事务则以嵌套事务方式执行,否则传播行为类似于PROPAGATION_REQUIRED。 |
事务隔离级别
| 事务隔离级别定义 | 隔离级别描述 |
|---|---|
| ISOLATION_DEFAULT | 使用底层数据存储的默认隔离级别。所有其他级别都对应于JDBC隔离级别。Spring的默认隔离级别。 |
| ISOLATION_READ_UNCOMMITTED | 可能会发生脏读、不可重复读和幻像读。该级别允许一个事务更改的行在提交该行中的任何更改之前被另一个事务读取,即脏读。如果任何更改被回滚,第二个事务将检索到无效行。 |
| ISOLATION_READ_COMMITTED | 禁止脏读,可能会发生不可重复读取和幻读。该级别仅禁止事务读取包含未提交更改的行。Oracle数据库的默认隔离级别。 |
| ISOLATION_REPEATABLE_READ | 禁止脏读和不可重复读,可能会发生幻读。该级别禁止事务读取未提交更改的行,也禁止一个事务读取行,第二个事务更改行,第一个事务重新读取行,第二次获得不同的值的情况。MySQL数据库的默认隔离级别。 |
| ISOLATION_SERIALIZABLE | 禁止脏读、不可重复读和幻读。并发执行效率低下。 |
事务超时定义
事务的超时设置,默认为底层数据库事务系统的默认超时时间,若不支持超时,则不支持,时间单位为秒。
事务的只读定义
事务的只读属性是指,对事务性资源进行只读操作或者是读写操作。若确定对事务相关的资源仅仅只进行读取操作,则可以将事务标志为只读的,以提高事务处理的性能。
回滚规则定义
该规则定义了哪些异常类(Throwable的子类型)会进行事务回滚,哪些不会。默认情况下,事务只有在遇到运行时异常才会回滚,遇到受检查的异常(如业务异常)则不会回滚,但是可以自定义事务在遇到哪些受检查异常时像遇到运行时异常时那样回滚,同理也可以定义在 遇到哪些受检查异常时不需要回滚。