【问题标题】:PHP+MYSQL_locks.....please help .....i got stuck in this ..?PHP + MYSQL_locks .....请帮助......我被困在这个......?
【发布时间】:2012-10-02 02:43:12
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 在上表中我只用读锁锁定了表......实际上我错误地写了读和写两者......

标签: php mysql


【解决方案1】:

查看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 表。

【讨论】:

    【解决方案2】:

    您的另一个查询正在等待很长时间才能解决锁定,以便可以执行它。目前,没有直接的方法放置任何计数器,用于检查查询是否超过某个时间阈值,则应该将其杀死。 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 使用KILL &lt;Query ID&gt; 进行查询。但是为了做所有这些事情,您将需要与 MySQL 服务器建立新的连接。您还将了解运行查询的时间。

    【讨论】:

    • 你能不能给我完整的 SHOW OPEN TABLES 语法......意味着它如何与示例一起工作......
    猜你喜欢
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多