有没有一种方法可以判断一个表/行是否涉及不同的会话';s交易


Is there a way to tell if a table/row is involved in a different session's transaction?

是否有方法判断当前事务中是否有其他会话正在使用表或表行?

如果启用锁监视器,您实际上可以使用SHOW ENGINE INNODB STATUS查看事务中未完成的行锁,但您需要解析结果才能获得任何可用的内容。这些锁定通常只是瞬间的。它们在提交交易后消失。

如果您试图序列化查询,您可以使用SELECT实现表锁定(针对整个表),或者(使用InnoDB)行级锁定。。。在共享模式下锁定(或者您可以让MySQL使用SERIALIZABLE隔离模式为您执行此操作)。

您甚至可以使用存储在数据库中的值来提出自己的锁定方案,我见过很多这样的实现。

默认的innodb_lock_wait_timeout为50秒,适用于innodb中的所有行级锁。表锁没有锁等待超时。

如果你更具体,比如提供一个实际的场景和想要的行为,我们将能够更详细地回答。

在提交之前能够检测到的更改,这将损害ACID的整个概念。

通常,如果事务中当前涉及表或行,则该表或行将被锁定,您将无法对其进行更改。如果您尝试查看,则会看到任何未提交的更改之前的状态。这是一个很好的理由,可以让事务保持短时间(例如,在等待用户输入时不要锁定行)。

对于更新,如果事务花费太长时间,您最终会看到超时(假设已配置)。

这就是ACID的全部意义——你要么看到所有的变化,要么看不到任何变化——你看不到部分变化,而且很少有提前知道的用例。


我的建议是重新思考你的问题。询问如何以特定的方式修复某件事对你来说是适得其反的。你应该陈述实际问题并询问如何解决。这样,我们会更好地了解背景,你就不会局限于可能的解决方案的一小部分。