我在php中创建了一个文件,在此我编写了一个代码来锁定具有读取模式的表。 在该文件下面,我在同一个表中写了一个插入操作,但是我们知道读锁只支持读操作,这意味着你只能查看表中的内容,但不能修改它。它运行正常。
PROBLEM_EXIST_HERE:我在同一个表中创建了另一个包含相同插入操作的文件。这里我只是编写插入操作,而不是锁定代码。
在使用此文件之前,我使用(RUN)第一个文件(包含Locking + insert)操作,然后在同一个浏览器中打开新选项卡并运行第二个文件(仅包含插入操作)。
现在我们知道读锁已经在表上修复了,那么为什么插入操作会继续?为什么它不会显示错误,表明该表处于READ锁定模式,因此无法更新?有没有人知道如何解决这个问题?
答案 0 :(得分:0)
查看LOCK TABLE的文档:
WRITE locks normally have higher priority than READ locks to ensure that updates are processed as soon as possible. This means that if one session obtains a READ lock and then another session requests a WRITE lock, subsequent READ lock requests wait until the session that requested the WRITE lock has obtained the lock and released it.
对于InnoDB表,InnoDB有一个Lock Monitor:
The InnoDB Lock Monitor is like the standard Monitor but also provides extensive lock information. To enable this Monitor for periodic output, create a table named innodb_lock_monitor.
更多:
The Lock Monitor is the same as the standard Monitor except that it includes additional lock information. Enabling either monitor for periodic output by creating the associated InnoDB table turns on the same output stream, but the stream includes the extra information if the Lock Monitor is enabled. For example, if you create the innodb_monitor and innodb_lock_monitor tables, that turns on a single output stream. The stream includes extra lock information until you disable the Lock Monitor by removing the innodb_lock_monitor table.
答案 1 :(得分:0)
您的另一个查询正在等待很长时间才能解析锁定以便可以执行。目前,没有直接的方法来放置任何计数器,用于检查查询是否超过某个阈值的时间然后它应该被杀死。 There are certain indirect ways given here
没有直接的方法可以知道桌子是否被你锁定。有时,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>
kill 查询。但是为了完成所有这些工作,您将需要与MySQL服务器建立新的连接。您还将了解运行查询的时间。