配置事务(@Transactional)

@Service
@Transactional
public class FooService {
    //...
}

@Transactional 注解可以很方便的对类或者方法开启事务支持。

要注意 @Transactional

import org.springframework.transaction.annotation.Transactional;

而不是

import javax.transaction.Transactional;

@Transactional 可以用于接口、类、方法。在不同的地方使用该注解,会拥有不同的优先级,高优先级的设定会覆盖低优先级的设定。优先级从高至低为:接口、超类、类、接口方法、超类方法、类方法

如果在类上使用 @Transactional 接口,则类中的所有 public 方法都会被自动标记为 @Transactional

注意:对接口使用 @Transactional 注解是不推荐的,也有可以接受的例子,例如 Spring Data 的 Repository。如果该注解被用于接口,那么默认的代理为 Java Dynamic Proxy,这意味着只有外部调用会被代理截获,也就是说类内部调用自己的方法是不会开始触发事务运行的,即便被调用方法被标记为了 @Transactional,也只有外部类调用该方法才会触发事务的运行。

注意:@Transactional 注解只在 public 可见性的方法上有效,如果标记 protected 或 private 可见性的方法,则 Spring 会静默地忽略,不会显示错误信息。

注意:默认情况下,回滚只发生在运行时错误(非受检错误)发生时,如果是受检错误则不会触发事务回滚。当然,我们可以使用注解参数 rollbackFornoRollbackFor 来配置所期望的行为,例如:

@Transactional(rollbackFor = { SQLException.class })
public void createCourseDeclarativeWithCheckedException(Course course) throws SQLException {
    courseDao.create(course);
    throw new SQLException("Throwing exception for demoing rollback");
}

@Transactional 注解可以使用参数来配置:

  • Propagation Type

    传递类型,之后会详细说明。

  • Isolation Level

    事务隔离级别,之后会详细说明。

  • Timeout

    被事务包围的操作的超时时间。

  • readOnly flag

    一个提示,提示持久化供应商事务应该是只读的。但是并不具有强制性,仅作为提示进行只读操作的优化,

  • Rollback rules

    回滚规则,默认只有运行时错误(非受检错误)发生时才会触发事务回滚。

最后更新于