如何判断一行是不是被锁定?
Posted
技术标签:
【中文标题】如何判断一行是不是被锁定?【英文标题】:How to tell if a row is locked?如何判断一行是否被锁定? 【发布时间】:2017-02-27 16:37:05 【问题描述】:在 INFORMIX 中对表行进行选择时,如果不使用“for update”构造,如何知道它当前是否被另一个用户锁定?
【问题讨论】:
【参考方案1】:有趣的问题,我很想知道您提出这个问题的动机和最终目标!
我不相信有一种方法(通过 select 语句,没有更新)来找出一行中是否有共享锁。只有当您的会话尝试修改该行时,您才会发现其他会话是否持有共享锁。
如果您只想知道一行是否持有排他锁,那么您可以将会话隔离级别设置为可重复读取。set isolation to repeatable read;
select * from tab1 where col1=1;
以上信息还假设表本身使用行级锁(默认为页级锁)。
注意:可重复读取是最严格的隔离级别。 (https://www.ibm.com/support/knowledgecenter/SSGU8G_12.1.0/com.ibm.sqls.doc/ids_sqs_0030.htm)
【讨论】:
我有一行信息要在应用程序中处理,这基本上是多个内部连接的结果。最终,处理完成后,只有一个表得到更新(此时,应用程序因锁而终止)。 您想知道哪个会话持有该行的锁吗?它可能是尝试同时读取或更新的任何其他会话(取决于隔离级别)。如果您拥有 DBA 权限,则可以采取许多措施来减少并发会话之间的争用。 不,只是想知道我正在处理的当前行是否被锁定(不管是谁锁定它)。 @mihirp724 您在应用程序中真正需要的是在锁定行的情况下进行某种错误处理。没有完美的方法来做您想做的事情(假设我了解确切的用例!),即选择一行,检查它是否有任何锁,如果没有锁定则更新它。原因是在并发系统中,您永远无法确定给定行是否将被锁定。即使在检查时没有锁,也可能在检查后立即被锁定!以上是关于如何判断一行是不是被锁定?的主要内容,如果未能解决你的问题,请参考以下文章