| 属性 | 作用 | 默认 |
|---|---|---|
| propagation | 被调用者事务与调用者事务之间的关系 | REQUIRED |
| isolation | 事务隔离级别,决定了事务的完整性 | DEFAULT |
| timeout | 事务过期时间 | -1(数据库事务过期时间) |
| readOnly | 是否为只读事务 | false |
| rollbackFor | 哪些异常引起事务回滚 | - |
| noRollbackFor | 哪些异常不引起事务回滚 | - |
propagation
当一个事务传播行为修饰的方法被另一个方法调用时,事务如何进行传播
| 选项 | 含义 |
|---|---|
| REQUIRED | 如果当前没有事务,则新建一个事务 |
| REQUIRES_NEW | 如果当前存在事务,则把事务挂起 |
| SUPPORTS | 支持当前事务,没有事务则不使用事务 |
| MANDATORY | 支持当前事务,否则将抛出IllegalTransactionStateException异常 |
| NOT_SUPPORTED | 以非事务方式执行 |
| NEVER | 以非事务方式执行,如果存在事务则抛出IllegalTransactionStateException异常 |
| NESETED | 如果当前存在事务,则对于该传播行为修饰的方法依然会使用当前事务 |
readonly
如果只是执行单条查询语句,则没有必要启用。如果一次性执行多条sql查询,比如报表查询,统计查询等,在这些场景下,多条查询sql必须保证整体一致性,否则在前一条sql查询之后,后一条sql查询之前,数据会存在被其他用户改变的概率,从而导致这次整体的统计查询将会出现读数据不一致的状态,此时就该启动只读事务的支持。
@Transaction注解失效的场景
实例
对于继承自Exception类的异常需要主动捕获(如IOException),否则事务不会回滚
主动catch处理异常会使事务无法生效
同一个类的方法(未被@Transactional标记)去调用一个被@Transactional标记的方法会导致被调用方法的事务失效