【发布时间】:2015-02-24 13:39:08
【问题描述】:
我想锁定一个表行,以便对该行的任何其他读取操作将等到锁定被释放,并且我想避免锁定整个表。
我有下表(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 ONLY?
我知道我可以设置
[mysqld]
transaction-isolation = SERIALIZABLE
autocommit = 0
在my.cnf,但我不想影响对其他表和架构进行的其他操作。
参考:
【问题讨论】:
-
欢迎来到 Stack Overflow,感谢您提出有趣的问题。您使用哪种主机语言连接到 MySQL?
-
嗨,奥利,感谢您的回复。将有多个客户端从该表中读取,并且它们可以用不同的语言(PHP 和 JS)编写。我正在寻找“服务器端”解决方案,因为我想强制执行它,而不管使用哪种语言来制作 SELECT。
标签: mysql transactions locking isolation-level transaction-isolation