1

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

рефов:

+0

Добро пожаловать в Stack Overflow и спасибо за интересный вопрос. С какого языка хоста вы подключаетесь к MySQL? –

+0

Привет, Олли, спасибо за ваш ответ. Из этой таблицы будет читаться более одного клиента, и они могут быть написаны на разных языках (PHP и JS). Я ищу решение «серверной стороны», потому что я хотел бы применять его независимо от языка, который используется для создания SELECT. –

ответ

0

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

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

Вы можете установить уровень изоляции транзакции так, как вы это сделали. После того, как вы установите для подключения, он останется установленным. См. Это, например. mySQL - Set isolation level using PHP's mysqli

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

 Смежные вопросы

  • Нет связанных вопросов^_^