【问题标题】:Object locking in DB2 LUWDB2 LUW 中的对象锁定
【发布时间】:2019-05-01 06:53:01
【问题描述】:

在 IBM DB2 LUW 中处理对象锁定时,我在我的表上使用了读取稳定性 (RS) 级别锁定。这会锁定我在 Select 查询中获取的记录,除非我完成了事务并明确提及 COMMIT 并释放锁定。在这个过程中,另一个查询/过程想要返回锁定的行用于不同的目的。这个怎么办?另外,还有一个参数WAIT_FOR_OUTCOME来设置锁定时间,这个超时在哪里定义?

【问题讨论】:

  • 如果您提供有关锁定和等待语句的更多信息,那就太好了。否则有很多问题。就像读者在 db2 中不会阻塞读者一样,除非您在锁定选择语句中使用“with rs use and keep [update|exclusive] locks”子句,那么如何准确地获得锁定等待?究竟在哪些陈述上? “如何解决这个问题”的问题应该更具体——去哪里,你想达到什么目标? “等待结果”子句不是为会话设置锁定超时,它是 CS(而不是 RS)阅读器等待或不等待锁定的指令。
  • 谢谢。让我告诉你我想要做什么。我有一个过程,我试图通过从同一个表中选择记录并修改一些列来插入表。我想锁定这些源记录,同时将其复制为应用程序中的某个人也可能会尝试编辑这些记录,因此我通过在 select 子句后提及 WITH RS 来使用 RS 级别锁定。
  • ..虽然此 INSERT 正在进行中,但如果应用程序中的某个人(我们有 UI 和服务调用)尝试编辑该记录,我想将锁定的记录发送给他们,并释放锁定只有在我的程序完成并提交记录从而释放锁之后。
  • 什么意思 - “我想把被锁定的记录发给他们”?如果您使用insert ... select ... with rs,那么您读取的这些行已经锁定到事务结束,其他会话将无法编辑这些行。

标签: plsql db2 procedure isolation-level locks


【解决方案1】:

信息不足:CUR_COMMIT 数据库的有效设置是什么?此外,锁定行为可能会随着您未提及的特定 Db2 注册表设置而改变,例如 DB2_SKIP_INSERTED 、 DB2_SKIP_DELETED 等。

如果CUR_COMMIT数据库参数的有效值为ON,并且其他连接正在使用CS隔离进行查询,那么其他连接将获取锁定行的当前提交值(即写入者没有阻塞读者)。

如果您希望使用等待结果,这是适用于 SELECT 语句的子句,请参阅documentation

使用特殊寄存器通过
SET CURRENT LOCK TIMEOUT WAIT n ;(其中 n 是秒数)进行特定于会话的等待控制,否则客户端超时(如果相关)或数据库级别的 LOCKTIMEOUT 设置将申请,以较低者为准。请注意,LOCKTIMEOUT 的默认值为 -1(永远等待),这几乎总是不合适的,OLTP 的典型值为 30 或 60。

其他连接可以尝试在每个语句中使用 UR isolation(例如,让查询选择锁定的行值)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    相关资源
    最近更新 更多