据我所知,Mysql DB 的默认事务隔离级别是 REPEATABLE_READ。 (看Mysql 事务隔离级别 https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html)。但是Mysql连接器8有以下代码:
public class DatabaseMetaData implements java.sql.DatabaseMetaData {
...
@Override
public int getDefaultTransactionIsolation() throws SQLException {
return java.sql.Connection.TRANSACTION_READ_COMMITTED;
}
}
他们只是忽略默认值REPEATABLE_READ
并设置较少的限制TRANSACTION_READ_COMMITTED
.
我不清楚他们为什么这样做?
MySQL Connector/J JDBC 驱动程序的默认设置不是TRANSACTION_REPEATABLE_READ
, it is TRANSACTION_READ_COMMITTED
正如所传达的DatabaseMetaData
执行。因此,虽然在没有指定事务配置时MySQL本身可能默认为可重复读,但JDBC驱动程序在创建事务时将使用已提交读作为其默认值。
的选择TRANSACTION_READ_COMMITTED
可能是历史性的,MySQL 以前的默认引擎是 MyISAM,而该引擎实际上并不支持事务,因此技术上任何更改都会立即提交,因此任何读取都会读取这些新行。对于 MyISAM,行为匹配 - 很大程度上 -TRANSACTION_READ_COMMITTED
.
然而,我们无法肯定地回答为什么 MySQL Connector/J 的开发人员真的选择它作为默认值。 JDBC 规范本身并不要求特定的默认值,但根据我的经验,许多 JDBC 驱动程序都使用它作为默认值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)