Mysql InnoDB 行锁定读取

标签 mysql transactions locking isolation mvcc

我已经阅读了 mysql 文档,也许我只是不太理解。我正在寻找的是来自其他 session 的阅读行锁定。当该行被锁定时,我希望其他 session 等待直到锁定被释放。我不希望其他 session 从快照中读取!他们必须等到发布!

我想得到的与下面的例子完全一样,但是是单行而不是整表锁:

START TRANSACTION
LOCK TABLES table1 WRITE
SELECT * FROM table1 WHERE id = 40912
UPDATE table1 SET column1 = 'value1' WHERE id = 40912
UNLOCK TABLES
COMMIT

提前致谢!

最佳答案

Elena Sharovar 的回答是一种方法,但可能没有完全解释需要什么。 每个 将要执行 SELECT 的进程都需要使用具有相同字符串的 GET_LOCK。如果他们这样做,MySQL 将自动等待(最多指定的秒数)返回结果,直到另一个线程释放锁。

下面是发生的事情,时间从上到下:

          THREAD 1                                 THREAD 2
DO GET_LOCK("table1.40912", 30)
SELECT * FROM table1 WHERE id=40912     DO GET_LOCK("table1.40912", 30)
[UPDATE query]                          [automatically waits]
[UPDATE query]                          [automatically waits]
DO RELEASE_LOCK("table1.40912")         [lock finally obtained, query terminates]
                                        SELECT * FROM table1 WHERE id=40912

关于Mysql InnoDB 行锁定读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13045021/

相关文章:

node.js - ClientSession 无法序列化为 BSON

数据库或用户级锁

php - 简单的 PHP 和 SQL 查询 - 更新值

mysql - MariaDB 中的 INTERSECT 查询

支持传播的 Spring 事务

c# - 在(不相关的?)事务中使用 IsolationLevel.ReadUncommitted 时,SqlDependency 订阅不起作用

php - 如何从现有登录 session 中调用 id?

php - 我如何使用 php 将大约 10000 行数据插入 MySQL

mysql - 为什么大表的表级锁定优于行级锁定?

c# - C#中的 "lock"语句是否耗时?