我想锁定一个表行,以便该行上的任何其他读取操作将等到锁定被释放,并且我想避免锁定整个表。
我有下表(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
我知道我可以设置
[mysqld]
transaction-isolation = SERIALIZABLE
autocommit = 0
in my.cnf
,但我不想影响对其他表和模式进行的其他操作。
参考: