- read uncommitted(未提交读)
- read committed(提交读、不可重复读)
- repeatable read(可重复读)
- serializable(可串行化)
- default (PlatformTransactionManager默认的隔离级别,使用的就是数据库默认的)
这是因为,Spring只提供统一事务管理接口,具体实现都是由各数据库自己实现(如MySQL)。Spring会在事务开始时,根据当前环境中设置的隔离级别,调整数据库隔离级别,由此保持一致。
在DataSourceUtils文件中,代码详细的输出了这个过程。
- // Apply specific isolation level, if any.
- Integer previousIsolationLevel = null;
- if (definition != null && definition.getIsolationLevel() != TransactionDefinition.ISOLATION_DEFAULT) {
- if (logger.isDebugEnabled()) {
- logger.debug("Changing isolation level of JDBC Connection [" + con + "] to " +
- definition.getIsolationLevel());
- }
- int currentIsolation = con.getTransactionIsolation();
- if (currentIsolation != definition.getIsolationLevel()) {
- previousIsolationLevel = currentIsolation;
- con.setTransactionIsolation(definition.getIsolationLevel());
- }
- }
结论:三种情况,如果Spring没有指定事务隔离级别,则会采用数据库默认的事务隔离级别;当Spring指定了事务隔离级别,则会在代码里将事务隔离级别修改为指定值;当数据库不支持这种隔离级别,效果则以数据库的为准(比如采用了MyISAM引擎)。
我们会使用如下的方式进行声明。如果不是有性能和需求问题,就不要瞎改。事务处理弄不好是会锁表的,而锁表在大并发的情况下是会死人的。
- @Transactional(isolation = Isolation.READ_UNCOMMITTED)