是否有方法判断当前事务中是否有其他会话正在使用表或表行?
如果启用锁监视器,您实际上可以使用SHOW ENGINE INNODB STATUS查看事务中未完成的行锁,但您需要解析结果才能获得任何可用的内容。这些锁定通常只是瞬间的。它们在提交交易后消失。
如果您试图序列化查询,您可以使用SELECT实现表锁定(针对整个表),或者(使用InnoDB)行级锁定。。。在共享模式下锁定(或者您可以让MySQL使用SERIALIZABLE隔离模式为您执行此操作)。
您甚至可以使用存储在数据库中的值来提出自己的锁定方案,我见过很多这样的实现。
默认的innodb_lock_wait_timeout为50秒,适用于innodb中的所有行级锁。表锁没有锁等待超时。
如果你更具体,比如提供一个实际的场景和想要的行为,我们将能够更详细地回答。
在提交之前能够检测到的更改,这将损害ACID的整个概念。
通常,如果事务中当前涉及表或行,则该表或行将被锁定,您将无法对其进行更改。如果您尝试查看,则会看到任何未提交的更改之前的状态。这是一个很好的理由,可以让事务保持短时间(例如,在等待用户输入时不要锁定行)。
对于更新,如果事务花费太长时间,您最终会看到超时(假设已配置)。
这就是ACID的全部意义——你要么看到所有的变化,要么看不到任何变化——你看不到部分变化,而且很少有提前知道的用例。
我的建议是重新思考你的问题。询问如何以特定的方式修复某件事对你来说是适得其反的。你应该陈述实际问题并询问如何解决。这样,我们会更好地了解背景,你就不会局限于可能的解决方案的一小部分。