public interface TransactionDefinition {
int PROPAGATION_REQUIRED = 0; // 支持当前事务,如果当前没有事务,就新建一个事务。
int PROPAGATION_SUPPORTS = 1; // 支持当前事务,如果当前没有事务,就以非事务方式执行。
int PROPAGATION_MANDATORY = 2; // 支持当前事务,如果当前没有事务,就抛出异常。
int PROPAGATION_REQUIRES_NEW = 3; // 新建事务,如果当前存在事务,把当前事务挂起。
int PROPAGATION_NOT_SUPPORTED = 4; // 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
int PROPAGATION_NEVER = 5; // 以非事务方式执行,如果当前存在事务,则抛出异常。
int PROPAGATION_NESTED = 6; // 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。
int ISOLATION_DEFAULT = -1; // 使用数据库默认的隔离级别
int ISOLATION_READ_UNCOMMITTED = 1; // 读未提交。允许读取并发事务尚未提交的数据变更,可能会导致脏读、不可重复读或幻读。
int ISOLATION_READ_COMMITTED = 2; // 读已提交。允许读取并发事务已经提交的数据,可以阻止脏读,但是不可重复读或幻读仍有可能发生。
int ISOLATION_REPEATABLE_READ = 4; // 可重复读。对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
int ISOLATION_SERIALIZABLE = 8; // 串行化。完全服从ACID的隔离级别,确保阻止脏读、不可重复读以及幻读。
int TIMEOUT_DEFAULT = -1;
/** 传播行为 */
default int getPropagationBehavior() {
return 0;
}
/** 隔离级别 */
default int getIsolationLevel() {
return -1;
}
/** 超时时间 */
default int getTimeout() {
return -1;
}
/** 是否只读 */
default boolean isReadOnly() {
return false;
}
@Nullable
default String getName() {
return null;
}
static TransactionDefinition withDefaults() {
return StaticTransactionDefinition.INSTANCE;
}
}
-
PROPAGATION_NESTED:嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作;而内层事务操作失败并不会引起外层事务的回滚。
-
PROPAGATION_REQUIRES_NEW:内层事务与外层事务就像两个独立的事务一样,一旦内层事务进行了提交后,外层事务不能对其进行回滚。两个事务互不影响。
-
脏读侧重于事务回滚,不可重复读侧重于修改或删除,幻读侧重于新增。
-
是否只读:通过将事务设置为只读,你就可以给数据库一个机会,让它应用它认为合适的优化措施。
-
事务超时:为了使应用程序很好地运行,事务不能运行太长的时间。因为事务可能涉及对数据库的锁定,所以长时间的事务会不必要的占用数据库资源。事务超时就是事务的一个定时器,在特定时间内事务如果没有执行完毕,那么就会自动回滚,而不是一直等待其结束。
-
回滚规则:定义了哪些异常会导致事务回滚而哪些不会。默认情况下,事务只有遇到运行期异常时才会回滚,而在遇到检查型异常时不会回滚;但是你也可以声明事务在遇到特定的检查型异常时像遇到运行期异常那样回滚。同样,你还可以声明事务遇到特定的异常不回滚,即使这些异常是运行期异常。