Ждать чтения строки, когда есть блокировка - изоляция транзакции

Я хочу заблокировать строку таблицы, чтобы любые другие операции чтения в этой строке ожидали снятия блокировки, и я хочу избежать блокировки всей таблицы.

У меня есть следующая таблица (InnoDB)

CREATE TABLE account_balance (
    account INTEGER UNIQUE, 
    balance INTEGER NOT NULL, 
    PRIMARY KEY (account)
);

Я выполняю следующую транзакцию, чтобы получить блокировку строки

START TRANSACTION;
SELECT balance FROM account_balance WHERE account = 1 FOR UPDATE;
SELECT SLEEP(10);
COMMIT;

И я хотел бы, чтобы следующий запрос ожидал снятия блокировки

SELECT balance FROM account_balance WHERE account = 1;

Для этого я нашел единственный способ запустить SELECT следующим образом

SET autocommit = 0; SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; SELECT ....;

Он будет ждать освобождения блокировки, но я должен ставить перед каждым префикс SELECT с параметрами автоматической фиксации и уровня изоляции для этой таблицы.

Есть ли способ настроить autocommit=0 а также transaction-isolation = SERIALIZABLE ТОЛЬКО на уровне таблицы?

Я знаю, что я мог бы установить

[mysqld]
transaction-isolation = SERIALIZABLE
autocommit = 0

в my.cnf, но я не хочу влиять на другие операции, выполняемые в других таблицах и схемах.

рефов:

1 ответ

Параметры автоматической фиксации и изоляции транзакции связаны не с какой-либо таблицей, а с каждым подключением к MySQL.

Большинство языковых привязок имеют функцию прямого вызова для включения или отключения автоматической фиксации. Например, http://php.net/manual/en/mysqli.autocommit.php

Вы можете установить уровень изоляции транзакции так, как вы это сделали. Как только вы установите это для соединения, оно останется настроенным. Смотрите это, например. mySQL - установить уровень изоляции с помощью PHP MySQL

Обычно рекомендуется помещать такой код установки режима сразу после кода, который устанавливает соединение, чтобы режимы были предсказуемыми для остальной части вашего приложения.

Другие вопросы по тегам