有没有办法判断一个表/行是否涉及不同的会话事务?

时间:2012-07-26 00:54:41

标签: php mysql sql innodb

有没有办法判断当前时刻另一个会话中的事务中是否正在使用表或表行?

2 个答案:

答案 0 :(得分:1)

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

通常,如果某个表或行当前涉及某个事务,它将被锁定,您将无法更改它。如果您尝试查看它,您将在任何未提交的更改之前看到它。这是使偶数事务保持短暂的一个很好的理由(例如,在等待用户输入时不要锁定行)。

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

这是ACID的全部要点 - 您要么看到所有更改,要么都看不到 - 没有任何意义,您可以看到部分更改,并且很少有预先知道的用例。


我建议重新考虑你的问题。询问如何以特定的方式修复某些东西会对你产生反作用。您应该说明实际问题并询问如何解决它。这样,我们就能更好地理解背景,并且您不会将自己限制在一小部分可能的解决方案中。

答案 1 :(得分:1)

如果启用lock monitor,您实际上可以在SHOW ENGINE INNODB STATUS的事务中查看未完成的行锁,但是您需要解析结果以获得任何可用的结果。这些锁通常只是暂时的。它们在交易完成后消失。

如果您正在尝试序列化查询,可以使用SELECT实现表锁定(对于整个表)或(使用InnoDB)行级锁定...或者你可以让MySQL执行此操作适用于SERIALIZABLE隔离模式的用户。

您甚至可以使用存储在数据库中的值来提出自己的锁定方案,我已经看到了许多实现的方法。

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

如果您更具体,例如提供实际场景和所需行为,我们将能够更详细地回答。