如何在不等待的情况下在 DB2 中锁定 table

how to lock table in DB2 without waiting

我想在 DB2(版本 11)中锁定 table,并且我不希望其他人在尝试更新锁定的 table 时等待我的锁定。 (抛出异常或 return 错误代码)

我使用了以下命令: 在独占模式下锁定 TABLE MYTABLE

但其他连接总是等待。

那么有什么办法可以停止等待呢?

对于 Linux/Unix/Windows 上的 Db2,如果您使用 'LOCK TABLE ... IN EXCLUSIVE MODE',则其他连接将等待您 commit/rollback。

对于 Linux/Unix/Windows 上的 Db2,默认情况下其他连接将等待 LOCKTIMEOUT seconds (default = -1 = wait forever ), or whatever the other application has configured in its connection either via SET CURRENT LOCK TIMEOUT (which can include setting NOT WAIT or other values) or in the other application's Db2-client configuration. See documentation here

有关客户端配置选项(db2cli.ini、db2dsdriver.cfg、连接属性等)的详细信息,请参阅 Db2 知识中心。

重要的是要了解 other 应用程序需要调整其锁定超时(在其代码中或在 Db2 客户端配置中),否则数据库参数 LOCKTIMEOUT 将决定他们的等待时间。

所以,简而言之,如果您希望 其他 应用程序不等待,那么这些应用程序必须 programmed/configured 为此目的,或者数据库配置 LOCKTIMEOUT 必须适当配置或两者兼而有之。

在实践中,这意味着您需要避免以独占模式(隐式或显式)锁定表,或者您需要在最安静的时间执行此操作并保持锁定的持续时间尽可能短。特别是,您的工作不能告诉其他 Db2 连接如何调整它们的锁定等待行为!

也许其他用户可以使用未提交的读取WITH UR

https://www.ibm.com/support/knowledgecenter/en/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0059225.html

或者,也许您可​​以使用 IN SHARE MODE 而不是 EXCLUSIVE

https://www.ibm.com/support/knowledgecenter/en/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0000972.html