我想锁定一个表格行,以便该行上的任何其他读取操作将等待,直到锁定被释放,并且我想避免拥有整个桌子上的锁。当它锁定时等待读取一行 - 事务隔离
我有如下表(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的方法吗?
我知道我可以在my.cnf
设置
[mysqld]
transaction-isolation = SERIALIZABLE
autocommit = 0
,但我不想影响其他表和模式进行其他操作。
裁判:
- 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? – 2015-02-24 13:40:45
嗨Ollie,谢谢你的回复。该表中将有多个客户端阅读,并且可以用不同语言(PHP和JS)编写。我正在寻找一个“服务器端”解决方案,因为我想强制执行它,而不考虑用于制作SELECT的语言。 – 2015-02-25 05:20:54