当有锁定时等待读取行 - 事务隔离

时间:2015-02-24 13:39:09

标签: mysql transactions locking isolation-level transaction-isolation

我想锁定一个表行,以便该行上的任何其他读取操作都会等到锁被释放,我想避免锁定整个表。

我有下表(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 = SERIALIZABLE

我知道我可以设置

[mysqld]
transaction-isolation = SERIALIZABLE
autocommit = 0
my.cnf中的

,但我不想影响在其他表和模式上执行的其他操作。

参考文献:

1 个答案:

答案 0 :(得分:0)

自动提交和事务隔离设置不与任何表相关联,而是与MySQL的每个连接相关联。

大多数语言绑定都有可直接调用的函数来启用或禁用自动提交。例如,http://php.net/manual/en/mysqli.autocommit.php

您可以按照自己的方式设置事务隔离级别。为连接设置后,它将保持设置状态。例如,见这个。 mySQL - Set isolation level using PHP's mysqli

在建立连接的代码之后立即放置此类模式设置代码通常是一种好习惯,因此模式可以为应用程序的其余部分预测。