Почему драйвер mysql JDBC возвращает TRANSACTION_READ_COMMITTED в качестве уровня изоляции по умолчанию - PullRequest
2 голосов
/ 20 октября 2019

Как я знаю, уровень изоляции транзакций по умолчанию для 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;
    }
}

Они просто игнорируют значение по умолчанию REPEATABLE_READ и устанавливают менее ограниченные TRANSACTION_READ_COMMITTED.

Мне не понятно, почему они это сделали?

1 Ответ

4 голосов
/ 20 октября 2019

Для драйвера JDBC MySQL Connector / J по умолчанию используется не TRANSACTION_REPEATABLE_READ, а TRANSACTION_READ_COMMITTED, как указано в этой реализации DatabaseMetaData. Таким образом, хотя сам MySQL может по умолчанию использовать повторяемое чтение, если не указана конфигурация транзакции, драйвер JDBC будет использовать фиксацию чтения в качестве значения по умолчанию при создании транзакций.

Выбор TRANSACTION_READ_COMMITTED, вероятно, является историческим, предыдущее значение по умолчаниюЯдром MySQL был MyISAM, и этот движок фактически не поддерживает транзакции, поэтому любые изменения были технически зафиксированы немедленно, и поэтому любое чтение считывало эти новые строки. Для MyISAM поведение совпадает - в основном - TRANSACTION_READ_COMMITTED.

Однако мы не можем с уверенностью ответить, почему разработчики MySQL Connector / J действительно выбрали это по умолчанию. Сама спецификация JDBC не требует определенного значения по умолчанию, но, по моему опыту, многие драйверы JDBC используют это как значение по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...