据我所知,Mysql DB 的默认事务隔离级别是 REPEATABLE_READ。(请参阅Mysql 事务隔离级别)。但是 Mysql 连接器 8 有以下代码:
public class DatabaseMetaData implements java.sql.DatabaseMetaData {
...
@Override
public int getDefaultTransactionIsolation() throws SQLException {
return java.sql.Connection.TRANSACTION_READ_COMMITTED;
}
}
Run Code Online (Sandbox Code Playgroud)
他们只是忽略默认值REPEATABLE_READ并设置较少的限制TRANSACTION_READ_COMMITTED。
我不清楚他们为什么这样做?
MySQL Connector/J JDBC 驱动程序的默认值不是TRANSACTION_REPEATABLE_READ,它是TRANSACTION_READ_COMMITTED由该DatabaseMetaData实现传达的。因此,尽管在未指定事务配置时 MySQL 本身可能默认为可重复读取,但 JDBC 驱动程序在创建事务时将使用已提交的读取作为其默认值。
的选择TRANSACTION_READ_COMMITTED可能是历史性的,MySQL 以前的默认引擎是 MyISAM,而该引擎实际上并不支持事务,因此技术上会立即提交任何更改,因此任何读取都会读取这些新行。对于 MyISAM,行为匹配 - 主要 - TRANSACTION_READ_COMMITTED。
但是,我们无法肯定地回答为什么 MySQL Connector/J 的开发人员真的选择了它作为默认设置。JDBC 规范本身不需要特定的默认值,但根据我的经验,很多 JDBC 驱动程序都使用它作为默认值。