Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法检查MySQL中的行状态(已锁定或未锁定)_Mysql_Database_Locking - Fatal编程技术网

无法检查MySQL中的行状态(已锁定或未锁定)

无法检查MySQL中的行状态(已锁定或未锁定),mysql,database,locking,Mysql,Database,Locking,在我的应用程序中,我需要在编辑某些行时锁定这些行。如果另一个用户将对该行进行选择,他的查询将需要等待,直到第一个用户释放锁。我的问题是,我需要查看查询是否正在等待,以便在这种情况下能够为进行查询的用户预约。你对这种情况有什么建议吗? 提前感谢。如果您在MySQL中使用事务,并且如果您使用最新版本的MySQL(>5.1),只需在事务内部(而不是之前)的目标行中进行select查询,即可设置行锁 并行运行的查询将自动等待到第一个事务结束。除非进行很长的事务,否则等待时间不会很长,并且该过程将在第一个

在我的应用程序中,我需要在编辑某些行时锁定这些行。如果另一个用户将对该行进行选择,他的查询将需要等待,直到第一个用户释放锁。我的问题是,我需要查看查询是否正在等待,以便在这种情况下能够为进行查询的用户预约。你对这种情况有什么建议吗?
提前感谢。

如果您在MySQL中使用事务,并且如果您使用最新版本的MySQL(>5.1),只需在事务内部(而不是之前)的目标行中进行select查询,即可设置行锁

并行运行的查询将自动等待到第一个事务结束。除非进行很长的事务,否则等待时间不会很长,并且该过程将在第一个事务结束后继续。除非您的处理需要15秒以上的时间,否则在锁定的情况下中止事务,向最终用户发送响应并稍后重新执行事务,您将失去更多的时间

MySQL有一个锁的超时设置(锁等待超时),您可以将此超时调整为一个相当低的值(比如3s),如果锁等待时间过长,您将出现异常,然后您将不得不中止事务,但是默认情况下,让MySQL进行锁定&等待管理,而不必在锁定的情况下提前中断事务


无论如何,您的应用程序代码应该有异常捕获循环来捕获这些超时以及死锁检测异常。经典的做法是重新启动整个事务,直到它工作为止,但如果您愿意,您也可以中止整个事务,并告诉用户他应该等待(但在90%的情况下,这比在不考虑用户交互的情况下重做事务要长)。

不是解决方案,但是一个变通办法

可能您可以尝试向表中添加状态列初始值可以是
PENDING

  • 仅选择处于挂起状态的记录
  • 启动交易时,将状态更新为“进行中”
  • 处理完记录后更新到
    DONE
如果您想重试由于某种原因失败的事务,
在字段中添加一个
过程开始时间
更新时间
如果状态为
进行中
的时间超过预期,您可以将它们重置为
PENDING
FAILED
并添加重试机制

表使用的存储引擎是什么?我使用的是InnoDB存储引擎。从我所读到的内容和您的建议来看,唯一的选择是将InnoDB_lock_wait_timeout变量设置为一个较小的值。但从我的观点来看,这是一种不优雅的态度。你还有其他的建议吗?无论如何,谢谢。您的事务有多长时间?对于长时间运行的事务,您可以有效地使用锁等待超时(可能是10秒)并捕获此异常(类似于数据库中的超时锁)。然后,在重试事务几次(3秒)后,如果仍然存在此锁定超时,您可以捕获它并告诉用户他应该等待15分钟,因为一个长的进程正在阻止数据库中的版本。