我的应用需要处理和更新,例如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表(高请求会影响很短的时间)会发生什么?
在客户之间拆分工作的最佳做法是什么?我对上面描述的模型没问题,但它会伤害任何东西(表,数据库还是服务器)?
答案 0 :(得分:0)
从技术上讲,没有2个线程可以同时请求锁定对象。 CPU时钟交替循环到线程。
首先请求锁定表的线程将获得锁定。后续线程将一直等到锁被释放。如果锁等待的时间超过LOCKTIMEOUT数据库配置参数,则请求程序将使用SQL代码911超时原因代码68
这不会损坏你的桌子或索引。
关于锁定的更多信息请参阅 http://db2portal.blogspot.co.za/search?q=DB2+Locking