我想锁定一个表行,以便对该行的任何其他读取操作将等到锁被释放,并且我想避免对整个表进行锁定。
我有下表(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
中,但我不想影响在其他表和模式上完成的其他操作。
引用:
最佳答案
自动提交和事务隔离设置不与任何表关联,而是与每个 MySQL 连接关联。
大多数语言绑定(bind)都有一个可直接调用的函数来启用或禁用自动提交。例如,http://php.net/manual/en/mysqli.autocommit.php
您可以按照您已经完成的方式设置事务隔离级别。一旦你为连接设置它,它将保持设置。例如看这个。 mySQL - Set isolation level using PHP's mysqli
在建立连接的代码之后立即放置此类模式设置代码通常是一种很好的做法,这样模式对于您的应用程序的其余部分来说是可预测的。
关于mysql - 当有锁时等待读取一行——事务隔离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28697295/