我有两个不同的事务,其中一个对SELECT条语句使用读锁(FOR SHARE),另一个使用写锁(FOR UPDATE).

假设他们正试图获得同一排的锁.以下是我试图理解的情景.

假设我有连续的请求流使用读锁,有时我需要获取写锁.

这些锁是使用FIFO策略来避免饥饿,还是其他一些策略,比如读锁,只要它能够获取锁,写锁就会等待所有读操作耗尽(在这种情况下,甚至是新的读操作).

我怀疑可能会发生第二次,但我不是100%确定.

我正在调查一个问题,找不到关于这个问题的好文档.

推荐答案

如果您缺乏文档,可以try 以下实验:

窗口1:

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from tablename for share;
+---------------------+
| ldt                 |
+---------------------+
| 1969-12-31 16:00:00 |
+---------------------+
1 row in set (0.00 sec)

窗口2:

mysql> update tablename set ldt=now();
(hangs, waiting for lock)

窗口3:

mysql> select * from tablename for share;
(hangs, also waiting for lock)

这表示X锁请求正在阻止后续的S锁请求.

50秒过go 了,然后:

窗口2:

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

然后马上:

窗口3:

mysql> select * from tablename for share;
+---------------------+
| ldt                 |
+---------------------+
| 1969-12-31 16:00:00 |
+---------------------+
1 row in set (41.14 sec)

在等待窗口2中的更新时,窗口3中的 Select 被阻止.当更新超时时,窗口3中的 Select 可以继续.

Mysql相关问答推荐

如何使用GROUP BY调优简单SQL查询

从MySQL JSON列中检索数组中的所有答案

Hibernate 不创建表'

我可以在姓名和姓名日期之间进行搜索吗?

如果其中一个表为空,则 mysql 中的查询会给出 0 个结果

是否可以使用以EXPLAIN EXTENDED ...开头的 SQL 语句修改数据?

如何获取每日登录用户数?

多个 FULLTEXT 索引上的 MySQL SELECT.结果极其缓慢

如何根据 R 中的价格范围将数据从一列复制到新列?

为什么 MySQL 不使用索引进行简单的SELECT * FROM Table WHERE field='value'查询?

在表中找到最大值,然后分别显示SQL组和每个SQL组中的最大值计数

MYSQL REGEXP_REPLACE 在数字之后

如何过滤表格,以便它显示最新的数据?

脚本超时,如果要完成导入,请重新提交相同的文件,导入将恢复

MySQL - 如何在 INSERT 语句中将字符串值解析为 DATETIME 格式?

如何在sequelize中定义多列的唯一索引

MYSQL_ROOT_PASSWORD 已设置但在 docker 容器中获取用户'root'@'localhost'的访问被拒绝(使用密码:YES)

MySQL - 我如何输入 NULL?

应该使用什么列类型将序列化数据存储在 mysql 数据库中?

如何在执行 sql 脚本时 echo 打印语句