经常INSERT / DELETE会破坏DB2表/索引吗?

时间:2017-02-01 03:18:08

标签: sql db2

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

因此,客户端在尝试使用MAIN_TB表中的/ update记录之前,会在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表(高请求会影响很短的时间)会发生什么?

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

1 个答案:

答案 0 :(得分:0)

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

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

这不会损坏你的桌子或索引。

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