mysql - 当有锁时等待读取一行——事务隔离

标签 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 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/

相关文章:

php - mysql在一个语句中从两个表中选择两列

mysql - 数据库中的运动跟踪

php - 为什么 Yii2 dateTime() 功能不写入时间?

ruby-on-rails - 提交所有操作后,rails Transactions block 是否退出?

c++ - 原子操作比锁定花费的时间更长(无争用)

PHP 根据参数是否在数据库中编写条件语句

java - 方法级的 EJB 事务属性覆盖

Android-重复 fragment 交易和手机资源(复杂)

android - 在屏幕锁定时启动 gps

c++ - 修复(锁定)std::vector 的大小