1

我想鎖定一個表格行,以便該行上的任何其他讀取操作將等待,直到鎖定被釋放,並且我想避免擁有整個桌子上的鎖。當它鎖定時等待讀取一行 - 事務隔離

我有如下表(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=0transaction-isolation = SERIALIZABLEONLY的方法嗎?

我知道我可以在my.cnf設置

[mysqld] 
transaction-isolation = SERIALIZABLE 
autocommit = 0 

,但我不想影響其他表和模式進行其他操作。

裁判:

+0

歡迎來到Stack Overflow,並感謝一個有趣的問題。您從哪種主機語言連接到MySQL? – 2015-02-24 13:40:45

+0

嗨Ollie,謝謝你的回覆。該表中將有多個客戶端閱讀,並且可以用不同語言(PHP和JS)編寫。我正在尋找一個「服務器端」解決方案,因爲我想強制執行它,而不考慮用於製作SELECT的語言。 – 2015-02-25 05:20:54

回答

0

自動提交和事務隔離設置與任何表不相關,但與每個連接到MySQL。

大多數語言綁定都有一個可直接調用的函數來啓用或禁用自動提交。例如,http://php.net/manual/en/mysqli.autocommit.php

您可以按照您的方式設置事務隔離級別。一旦你設置了連接,它將保持設置。例如看到這個。 mySQL - Set isolation level using PHP's mysqli

在建立連接的代碼之後立即放置這樣的模式設置代碼通常是很好的做法,所以這些模式對於其他應用程序是可預測的。