使用存储过程的数据库中的对象锁定问题



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

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

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

我在考虑解决此问题的两种选择:

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

  2. 以块的形式插入数据,如果失败了,有一个机制可以从插入的最后一条记录重试(需要一种机制(。

我正在使用 DB2 和普通 jdbc 来插入记录。

请让我知道解决此问题的最佳方法是什么

V4.5 是一个古董,但即使在那时,大多数正常的数据库操作也不需要对文件进行独占锁定。 听到这里涉及对象锁,我感到非常惊讶。

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

如果无法修改 IBM 端,请考虑装入一个临时表,然后使用 JT400 发出 CPYF 命令,让 IBM OS 将行复制到实际表中。 这应该比通过网络运行得更快。 或者,将其从 TEMPFILE 重命名为 REALFILE,但 IBM 进程可能不喜欢这样。

你没有说你正在使用什么数据库或库,但你应该考虑使用事务来控制同时读取和写入。进程 1 应在单个事务中写入数据块。在全部写入之前,这些数据都不会对进程 2 可见,因此两者之间不应发生任何冲突。这是假设您对数据设置了正确的事务隔离级别。

例如,如果您使用的是 Spring,那么很容易用 @Transactional 标记函数,以便 tat 函数中的所有数据库调用都在单个事务中运行。

相关内容

  • 没有找到相关文章

最新更新