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

在建立连接的代码之后立即放置这样的模式设置代码通常是很好的做法,所以这些模式对于其他应用程序是可预测的。