0

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

4

2 回答 2

1

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

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

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

这就是 ACID 的全部意义——你要么看到所有的变化,要么一个都看不到——没有一点可以看到部分变化,而且很少有提前知道的用例。


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

于 2012-07-26T01:09:35.310 回答
1

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

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

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

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

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

于 2012-07-26T01:35:33.870 回答