Spring 事务中的几种隔离级别介绍
Spring 为了方便用户设定事务的隔离级别,专门定义了一个枚举类:Isolation。这个枚举类和事务传播行为的枚举类很像。
public enum Isolation {
DEFAULT(TransactionDefinition.ISOLATION_DEFAULT),
READ_UNCOMMITTED(TransactionDefinition.ISOLATION_READ_UNCOMMITTED),
READ_COMMITTED(TransactionDefinition.ISOLATION_READ_COMMITTED),
REPEATABLE_READ(TransactionDefinition.ISOLATION_REPEATABLE_READ),
SERIALIZABLE(TransactionDefinition.ISOLATION_SERIALIZABLE);
private final int value;
Isolation(int value) {
this.value = value;
}
public int value() {
return this.value;
}
}
TransactionDefinition.ISOLATION_DEFAULT 指的是使用后端数据库默认的隔离级别。比如,MySQL 默认是 REPEATABLE_READ,而 Oracle 默认是 READ_COMMITTED。
TransactionDefinition.ISOLATION_READ_UNCOMMITTED 是最低的隔离级别,实际应用中很少使用。因为它允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读的问题。
TransactionDefinition.ISOLATION_READ_COMMITTED 允许读取并发事务已经提交的数据。这种隔离级别可以防止脏读,但仍有可能发生幻读或不可重复读。
TransactionDefinition.ISOLATION_REPEATABLE_READ 保证对同一字段的多次读取结果都是一致的,除非数据是被当前事务自己修改的。它可以防止脏读和不可重复读,但仍有可能发生幻读。
TransactionDefinition.ISOLATION_SERIALIZABLE 是最高的隔离级别,完全遵循 ACID 原则。所有事务都将依次逐个执行,这样事务之间就完全不可能产生干扰。也就是说,这个级别可以防止脏读、不可重复读以及幻读。不过,使用这个隔离级别会对程序性能产生较大影响,通常情况下不太会用到。
更新时间:2024-12-27 17:41