2

我在 php 中创建了一个文件,并在此文件下编写了一个代码来锁定具有读取模式的表。在那个文件下面我写了一个插入操作到同一个表中,但是我们知道读锁只支持读操作,这意味着你只能查看表中的内容,但你不能修改它。它运行良好。

PROBLEM_EXIST_HERE:我在同一张表中创建了另一个包含相同插入操作的文件。这里我只写插入操作,而不是锁定代码。

在使用此文件之前,我使用(RUN)第一个文件(包含锁定+插入)操作,之后我在同一浏览器中打开新选项卡并运行第二个文件(仅包含插入操作)。

现在我们知道读锁已经固定在表上,那为什么还要进行插入操作呢?为什么它不会向我显示一个错误,说明该表处于 READ 锁定模式,因此无法更新?有谁知道如何解决这个问题?

  1. 有谁知道如何知道一个表是否在 mysql db 中被锁定在读或写条件下?谁能告诉我这个的php代码?我已经搜索了一整天,但没有解决方案。请用简单的语言写出简单的解决方案。
4

2 回答 2

0

您的另一个查询正在等待很长时间才能解决锁定,以便可以执行它。目前,没有直接的方法放置任何计数器,用于检查查询是否超过某个时间阈值,则应将其杀死。这里给出了一些间接的方式

没有直接的方法可以知道表是否被您锁定。有时 MySQL 在执行某些查询时也会锁定表。您可以通过触发以下查询来了解表是否已锁定。

SHOW OPEN TABLES FROM <database name> WHERE `table` = "<table_name>";

在此查询中,如果in_use列的值为1 ,则表被锁定,如果为 0 ,则未锁定

编辑

还有另一种方法可以使用 Information_schema 的进程列表信息。

运行查询:

SELECT * FROM information_schema.`PROCESSLIST` WHERE db="<DB name>" AND command = "Query";

从结果中查看"state"消息列是什么?它会让你更深入地了解正在发生的事情。它还会为您提供查询 ID,您还可以通过使用KILL <Query ID>. 但是为了做所有这些事情,你将需要与 MySQL 服务器建立新的连接。您还将了解运行查询的时间。

于 2012-10-11T13:20:01.177 回答
0

查看LOCK TABLE的文档:

WRITE 锁通常比 READ 锁具有更高的优先级,以确保更新
尽快处理。这意味着如果一个会话获得 READ
锁,然后另一个会话请求写锁,随后的读锁请求
等到请求写锁的会话获得锁,然后
释放它。

对于 InnoDB 表,InnoDB 有一个Lock Monitor

InnoDB Lock Monitor 与标准 Monitor 类似,但也提供了广泛的锁
信息。要启用此监视器以进行定期输出,请创建一个名为
innodb_lock_monitor。

更多的:

Lock Monitor 与标准 Monitor 相同,只是它包括额外的
锁定信息。通过创建关联来启用任一监视器的定期输出
InnoDB 表打开相同的输出流,但该流包含额外的
如果启用了锁定监视器的信息。例如,如果您创建 innodb_monitor
和 innodb_lock_monitor 表,打开单个输出流。流包括
额外的锁定信息,直到您通过删除
innodb_lock_monitor 表。
于 2012-10-11T13:02:40.863 回答