有时候需要在程序中执行一系列数据库dml操作,但是我们又希望该一系列dml操作要么全部成功,要么遇到异常回滚。这里就可以使用@Transactional注解;
Transactional注解可以在类和方法上使用,当执行数据库dml语句时,遇到失败回滚事务。
笔记已经上传到有道云笔记,有需要可以直接下载,下载地址:
@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Transactional { /* * 指定使用那个事务管理器 */ @AliasFor("transactionManager") String value() default ""; @AliasFor("value") String transactionManager() default ""; /* * 传播行为 * TransactionDefinition.PROPAGATION_MANDATORY * 支持当前事务;如果不存在当前事务,则抛出一个异常。 * <p> * TransactionDefinition.PROPAGATION_NESTED * 如果存在当前事务,则在一个嵌套的事务中执行。 * <p> * TransactionDefinition.PROPAGATION_NEVER * 不支持当前事务;如果存在当前事务,则抛出一个异常。 * <p> * TransactionDefinition.PROPAGATION_NOT_SUPPORTED * 不支持当前事务;而总是执行非事务性。 * <p> * TransactionDefinition.PROPAGATION_REQUIRED * 支持当前事务;如果不存在事务,则创建一个新的事务。 * <p> * TransactionDefinition.PROPAGATION_REQUIRES_NEW * 创建一个新事务,如果存在一个事务,则把当前事务挂起。 * <p> * TransactionDefinition.PROPAGATION_SUPPORTS * 支持当前事务;如果不存在,则执行非事务性。 * <p> * TransactionDefinition.TIMEOUT_DEFAULT * 使用默认超时的底层事务系统,或者如果不支持超时则没有 */ Propagation propagation() default Propagation.REQUIRED; /* * 隔离级别 * TransactionDefinition.ISOLATION_DEFAULT * 这是默认的隔离级别 * <p> * TransactionDefinition.ISOLATION_READ_COMMITTED * 表明能够阻止误读;可以发生不可重复读和虚读 * <p> * TransactionDefinition.ISOLATION_READ_UNCOMMITTED * 表明可以发生误读、不可重复读和虚读。 * <p> * TransactionDefinition.ISOLATION_REPEATABLE_READ * 表明能够阻止误读和不可重复读;可以发生虚读。 * TransactionDefinition.ISOLATION_SERIALIZABLE * 表明能够阻止误读、不可重复读和虚读。 */ Isolation isolation() default Isolation.DEFAULT; /* * 超时时间 */ int timeout() default -1; /* * 是否只读 */ boolean readOnly() default false; /* * 指定那些异常回滚事务 */ Class<? extends Throwable>[] rollbackFor() default {}; String[] rollbackForClassName() default {}; /* * 指定那些发生那些异常不需要回滚事务 */ Class<? extends Throwable>[] noRollbackFor() default {}; String[] noRollbackForClassName() default {}; }