Ждать чтения строки, когда есть блокировка - изоляция транзакции
Я хочу заблокировать строку таблицы, чтобы любые другие операции чтения в этой строке ожидали снятия блокировки, и я хочу избежать блокировки всей таблицы.
У меня есть следующая таблица (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
Обычно рекомендуется помещать такой код установки режима сразу после кода, который устанавливает соединение, чтобы режимы были предсказуемыми для остальной части вашего приложения.