@EnableTransactionManagement启用Spring基于注解的事务管理功能,需要和@Configuration注解一起使用。
@Transactional表示方法和类需要开启事务,当作用与类上时,类中所有方法均会开启事务,当作用于方法上时,方法开启事务,方法上的注解无法被子类所继承。
Spring定义了七种传播方式
TransactionDefinition.PROPAGATION_REQUIRED:"如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。"
TransactionDefinition.PROPAGATION_REQUIRES_NEW:"创建一个新的事务,如果当前存在事务,则把当前事务挂起。"
TransactionDefinition.PROPAGATION_SUPPORTS:"如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。"
TransactionDefinition.PROPAGATION_NOT_SUPPORTED:"以非事务方式运行,如果当前存在事务,则把当前事务挂起。"
TransactionDefinition.PROPAGATION_NEVER:"以非事务方式运行,如果当前存在事务,则抛出异常。"
TransactionDefinition.PROPAGATION_MANDATORY:"如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。"
TransactionDefinition.PROPAGATION_NESTED:"如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;"、"如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。"
Spring中定义了五种隔离规则
@Transactional(isolation = Isolation.DEFAULT)
@Transactional(isolation = Isolation.READ_UNCOMMITTED)
@Transactional(isolation = Isolation.READ_COMMITTED)
@Transactional(isolation = Isolation.REPEATABLE_READ)
@Transactional(isolation = Isolation.SERIALIZABLE)
回滚规则
@Transactional(rollbackFor = Exception.class)
事务超时
@Transactional(timeout=30)
是否只读
@Transactional(readOnly = true)
事务失效
@Transactional注解未打在public方法上
目标方法用final修饰
同一个类中的方法直接内部调用原因:方法被事务管理是因为Apring AOP为其生成代理了对象,但是直接this调用同类方