【问题标题】:Will frequent INSERT/DELETE destroy DB2 table/index?频繁的 INSERT/DELETE 会破坏 DB2 表/索引吗?
【发布时间】:2017-02-01 03:18:07
【问题描述】:

我的应用程序需要处理和更新,例如MAIN_TB 表中有 1000 万条记录。为了提高性能,我在四个通过 JDBC 驱动程序访问我的 DB2 数据库的客户端上运行我的应用程序。我不知道如何在这些客户端之间拆分记录,所以我决定使用 LOCK_TB 表来保存有关 MAIN_TB 表中“锁定”记录的信息。

因此,客户端在尝试使用/更新 MAIN_TB 表中的记录之前,会在 LOCK_TB 表中放置一个“锁定”记录。然后客户端将其解锁。这是命令:

INSERT INTO LOCK_TB
      (doc_id, locked_on, locked_by) 
VALUES (111, '2017-01-01', 222)

DOC_ID 是一个主键,它具有指向 MAIN_TB 表中 DOC_ID 列的外键。

因此,如果 INSERT 失败,则意味着记录已经存在(锁定)并且客户端会跳过 MAIN_TB 表中的记录。如果它没有失败,则意味着插入了新的锁定记录,并且客户端可以使用 MAIN_TB 表中的数据。一旦完成,它就会释放锁:

DELETE FROM LOCK_TB WHERE doc_id=111

(显然LOCK_TB中的记录不会超过四个,因为有四个客户端)

那么如果这四个客户端同时请求 INSERT/DELETE 到 LOCK_TB 表中会发生什么(短时间内高请求影响)?

在客户之间分配工作的最佳做​​法是什么?我对上面描述的模型没问题,但它会伤害任何东西(表、数据库或服务器)吗?

【问题讨论】:

  • 为什么不让 DB2 自己管理并发?

标签: sql db2


【解决方案1】:

从技术上讲,没有 2 个线程可以同时请求锁定一个对象。 CPU 时钟为线程交替循环。

首先请求表上锁的线程将获得锁。后续线程会一直等到锁被释放。如果锁的等待时间超过 LOCKTIMEOUT 数据库配置参数,请求者将超时,并返回 SQL 代码 911 原因代码 68

这不会损坏您的表或索引。

有关锁定的更多信息,请参阅 http://db2portal.blogspot.co.za/search?q=DB2+Locking

【讨论】:

  • 我不是在谈论 DB2 系统锁。我想限制对 MANT_TB 中行的访问。所以只有 CLIENT1 上的一个特定 PROCESS1 可以访问它。 CLIENT2 上的 PROCESS1 应该无法访问该行。 CLIENT2 上的 PROCESS2 可以访问。所以这就是我创建 LOCK_TB 表的原因
  • 只要工作单元未被提交,该行就会被锁定。
  • 抱歉造成误会。我真的不需要锁定 MAIN_TB 表中的记录。我只想让其他客户跳过它,而只有一个处理它。所以我想在四个客户之间分配工作。并且 CLIENT1 需要知道 CLIENT2 已经在处理该记录(正在执行一些程序..),因此可以跳过该记录
猜你喜欢
  • 1970-01-01
  • 2015-04-24
  • 2015-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多