Spring声明式事务@Transactional注解解读

75 阅读2分钟
属性作用默认
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查询之前,数据会存在被其他用户改变的概率,从而导致这次整体的统计查询将会出现读数据不一致的状态,此时就该启动只读事务的支持。

image.png

@Transaction注解失效的场景

image.png

实例

对于继承自Exception类的异常需要主动捕获(如IOException),否则事务不会回滚

image.png

主动catch处理异常会使事务无法生效

image.png

同一个类的方法(未被@Transactional标记)去调用一个被@Transactional标记的方法会导致被调用方法的事务失效

image.png

image.png