配置事务(@Transactional)
@Transactional
注解可以很方便的对类或者方法开启事务支持。
要注意 @Transactional
是
而不是
@Transactional
可以用于接口、类、方法。在不同的地方使用该注解,会拥有不同的优先级,高优先级的设定会覆盖低优先级的设定。优先级从高至低为:接口、超类、类、接口方法、超类方法、类方法。
如果在类上使用 @Transactional
接口,则类中的所有 public 方法都会被自动标记为 @Transactional
。
注意:对接口使用 @Transactional
注解是不推荐的,也有可以接受的例子,例如 Spring Data 的 Repository。如果该注解被用于接口,那么默认的代理为 Java Dynamic Proxy,这意味着只有外部调用会被代理截获,也就是说类内部调用自己的方法是不会开始触发事务运行的,即便被调用方法被标记为了 @Transactional
,也只有外部类调用该方法才会触发事务的运行。
注意:@Transactional
注解只在 public 可见性的方法上有效,如果标记 protected 或 private 可见性的方法,则 Spring 会静默地忽略,不会显示错误信息。
注意:默认情况下,回滚只发生在运行时错误(非受检错误)发生时,如果是受检错误则不会触发事务回滚。当然,我们可以使用注解参数 rollbackFor
和 noRollbackFor
来配置所期望的行为,例如:
@Transactional
注解可以使用参数来配置:
Propagation Type
传递类型,之后会详细说明。
Isolation Level
事务隔离级别,之后会详细说明。
Timeout
被事务包围的操作的超时时间。
readOnly flag
一个提示,提示持久化供应商事务应该是只读的。但是并不具有强制性,仅作为提示进行只读操作的优化,
Rollback rules
回滚规则,默认只有运行时错误(非受检错误)发生时才会触发事务回滚。
最后更新于