Я хочу заблокировать строку таблицы, чтобы любые другие операции чтения в этой строке будут ждать, пока блокировка не будет выпущена, и я хочу избежать блокировка всей таблицы.wait, чтобы прочитать строку, когда есть блокировка на ней - изоляция транзакции
У меня есть следующая таблица (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 и уровня изоляции настройки для этой таблицы.
Есть ли способ для настройки autocommit=0
и transaction-isolation = SERIALIZABLE
ТОЛЬКО на уровне таблицы?
Я знаю, что я мог бы установить
[mysqld]
transaction-isolation = SERIALIZABLE
autocommit = 0
в my.cnf
, но я не хочу, чтобы повлиять на другие операции, сделанные на других таблицах и схемах.
рефов:
- http://dev.mysql.com/doc/refman/5.6/en/set-transaction.html
- http://dev.mysql.com/doc/refman/5.6/en/innodb-lock-modes.html
Добро пожаловать в Stack Overflow и спасибо за интересный вопрос. С какого языка хоста вы подключаетесь к MySQL? –
Привет, Олли, спасибо за ваш ответ. Из этой таблицы будет читаться более одного клиента, и они могут быть написаны на разных языках (PHP и JS). Я ищу решение «серверной стороны», потому что я хотел бы применять его независимо от языка, который используется для создания SELECT. –