JdbcTemplate支持设置事务的隔离级别。事务隔离级别指多个事务并发访问数据库时,事务之间的隔离程度。
JdbcTemplate允许设置以下几种事务隔离级别:
- ISOLATION_DEFAULT:使用数据库默认隔离级别,MySQL默认为REPEATABLE_READ
- ISOLATION_READ_UNCOMMITTED:最低隔离级别,允许读取未提交的数据,可能会导致脏读、幻读和不可重复读
- ISOLATION_READ_COMMITTED:允许读取并发事务已经提交的数据,可以避免脏读,但幻读或不可重复读仍可能发生
- ISOLATION_REPEATABLE_READ:对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以避免脏读和不可重复读,但幻读仍可能发生。
- ISOLATION_SERIALIZABLE:最高隔离级别,完全串行化事务,确保事务操作完全隔离,避免脏读、不可重复读以及幻读。
设置事务隔离级别的步骤如下:
- 在 Spring 配置文件中进行事务管理器和隔离级别的配置:
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
<property name="defaultIsolationLevel" value="ISOLATION_REPEATABLE_READ"/>
</bean>
- 在JdbcTemplate中添加
@Transactional
注解,指定隔离级别:
public class UserDaoImpl implements UserDao {
@Transactional(isolation = Isolation.REPEATABLE_READ)
public void saveUser(User user) {
jdbcTemplate.update(SQL_INSERT, ...);
}
}
- 事务操作时会按指定的隔离级别进行。
例如,设置的是ISOLATION_REPEATABLE_READ隔离级别,则:
- 事务内多次读同一数据结果是一致的
- 但另一个并发事务插入新的符合条件数据时,第一个事务查询不见新插入的数据,出现幻读
所以,通过为JdbcTemplate的方法指定@Transactional注解,可以选择适合的事务隔离级别,这给事务处理带来更精细的控制能力。