1

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

我有下表(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,但我不想影响对其他表和模式进行的其他操作。

参考:

4

1 回答 1

0

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

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

您可以按照您所做的方式设置事务隔离级别。为连接设置后,它将保持设置状态。参见这个例子。mySQL - 使用 PHP 的 mysqli 设置隔离级别

在建立连接的代码之后立即放置此类模式设置代码通常是一种很好的做法,因此这些模式对于您的应用程序的其余部分是可预测的。

于 2015-02-24T13:49:43.673 回答