【问题标题】:How to tell if a row is locked?如何判断一行是否被锁定?
【发布时间】:2017-02-27 16:37:05
【问题描述】:

在 INFORMIX 中对表行进行选择时,如果不使用“for update”构造,如何知道它当前是否被另一个用户锁定?

【问题讨论】:

    标签: sql informix 4gl


    【解决方案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 您在应用程序中真正需要的是在锁定行的情况下进行某种错误处理。没有完美的方法来做您想做的事情(假设我了解确切的用例!),即选择一行,检查它是否有任何锁,如果没有锁定则更新它。原因是在并发系统中,您永远无法确定给定行是否将被锁定。即使在检查时没有锁,也可能在检查后立即被锁定!
    猜你喜欢
    • 2012-02-05
    • 1970-01-01
    • 2020-01-04
    • 2017-10-15
    • 1970-01-01
    • 2015-06-11
    • 2012-06-02
    • 1970-01-01
    • 2010-09-25
    相关资源
    最近更新 更多