使用存储过程在DB中对象锁定问题

时间:2013-10-07 20:24:55

标签: java jdbc db2 prepared-statement ibm-midrange

我有一个从文件加载数据然后尝试在表中插入记录的进程。

如果文件太大,则需要一段时间才能加载XYZ表中的所有数据。我正在使用批处理在表中插入记录。

与此同时,另一个进程启动并尝试根据XYZ表中的某些条件读取数据,因为第1个进程尚未完成将数据写入表中,并且第2个进程尝试读取相同的数据,我得到一个使用中的对象错误。

我在考虑解决此问题的两个选项:

  1. 除非process1插入所有记录,否则请保持其中一个状态列不同,以便process2无法检索记录

  2. 以块的形式插入数据,如果出现故障,可以从插入的最后一条记录重试机制(需要一种机制)。

  3. 我使用DB2和普通的jdbc来插入记录。

    请让我知道解决此问题的最佳方式

2 个答案:

答案 0 :(得分:1)

V4.5是古董,但即便如此,大多数普通数据库操作都不需要对文件进行独占锁定。听到这里涉及物体锁定,我感到非常惊讶。

我建议稍微修改IBM方面。继续使用JDBC将行加载到DB2表中,就像现在一样,但是当批量加载完成后,将一行加载到新表中。新表中的这一行将触发IBM进程处理完全加载的原始表。 IBM管理员可以使用新表上的触发器来通知新记录已到达。

如果无法修改IBM端,请考虑加载临时表,然后使用JT400发出CPYF命令,让IBM操作系统将行复制到实际表中。这应该比网络运行得快得多。或者,将它从TEMPFILE重命名为REALFILE,但IBM进程可能不喜欢它。

答案 1 :(得分:0)

您没有说明您正在使用哪些数据库或库,但您应该查看使用事务来控制同时读取和写入。进程1应该在单个事务中写入数据块。在完成所有数据写入之前,这些数据都不会对进程2可见,因此您不应该在这两者之间产生任何冲突。这假设您已在数据上设置了正确的事务隔离级别。

例如,如果你使用的是Spring,那么很容易用@Transactional标记一个函数,这样所有的数据调用功能都可以在一个事务中运行。