Spring事务隔离级别与Mysql InnoDB事务隔离级别的关系

这里不再重复READ_UNCOMMITTED, READ_COMMITTED, REAPEATED_READ, SERIALIZABLE这几种标准事务隔离级别的关系,网上资料一大把。很多朋友可能会有疑惑,如果Spring事务可以设置隔离级别,而数据库也可以设置默认隔离级别,那他们到底是怎样的关系呢?

直接说结论:

  • Spring会在事务开始时,根据你程序中设置的隔离级别,调整数据库隔离级别与你的设置一致。
  • 当使用Serializable级别时,Mysql在执行SQL时会自动修改为select .... lock in share mode, 即使用共享锁。此时允许同时读,但只允许一个事务写,且锁的是行而不是整张表

这意味着:

  • 如果数据库不支持某种隔离级别,那么Spring设置了也无效。
  • 当使用Serializable级别时,如果两个事务读写的不是同一行,那么它们是互不影响的。如果操作同一行记录,那么允许同时读,但如果出现一个对此行的写操作,则在写事务没有提交之前,所有的读事务都会被block。

你可能感兴趣的:(Java)