缓缓深入:面试工作两不误,源码级掌握Spring事务

  • read uncommitted(未提交读)
  • read committed(提交读、不可重复读)
  • repeatable read(可重复读)
  • serializable(可串行化)
  • default (PlatformTransactionManager默认的隔离级别,使用的就是数据库默认的)

这是因为,Spring只提供统一事务管理接口,具体实现都是由各数据库自己实现(如MySQL)。Spring会在事务开始时,根据当前环境中设置的隔离级别,调整数据库隔离级别,由此保持一致。

在DataSourceUtils文件中,代码详细的输出了这个过程。


  1. // Apply specific isolation level, if any
  2. Integer previousIsolationLevel = null
  3. if (definition != null && definition.getIsolationLevel() != TransactionDefinition.ISOLATION_DEFAULT) { 
  4.     if (logger.isDebugEnabled()) { 
  5.         logger.debug("Changing isolation level of JDBC Connection [" + con + "] to " + 
  6.                 definition.getIsolationLevel()); 
  7.     } 
  8.     int currentIsolation = con.getTransactionIsolation(); 
  9.     if (currentIsolation != definition.getIsolationLevel()) { 
  10.         previousIsolationLevel = currentIsolation; 
  11.         con.setTransactionIsolation(definition.getIsolationLevel()); 
  12.     } 

结论:三种情况,如果Spring没有指定事务隔离级别,则会采用数据库默认的事务隔离级别;当Spring指定了事务隔离级别,则会在代码里将事务隔离级别修改为指定值;当数据库不支持这种隔离级别,效果则以数据库的为准(比如采用了MyISAM引擎)。

我们会使用如下的方式进行声明。如果不是有性能和需求问题,就不要瞎改。事务处理弄不好是会锁表的,而锁表在大并发的情况下是会死人的。


  1. @Transactional(isolation = Isolation.READ_UNCOMMITTED) 
【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章