我有一个数据库场景(我正在使用 Oracle),其中几个进程将插入到一个表中,并且一个进程从中选择。该表主要用作中间存储,多个进程(以下称为 Writers)向其写入日志事件,而单个进程(以下称为 Reader)则从中读取事件以进行进一步处理。Reader 必须读取插入到表中的所有事件。
目前,这是通过为每个插入的记录分配一个升序的 id 来完成的。读取器周期性地从表中选择一个条目块,其中 id 大于先前读取块的最大 id。例如:
SELECT
*
FROM
TRANSACTION_LOG
WHERE
id > (
SELECT
last_id
FROM
READER_STATUS
);
这种方法的问题在于,由于写入器是并发操作的,因此行并不总是根据其分配的 id 按顺序插入,即使这些是按顺序升序分配的。也就是说,有时会在 id=110 的记录之后写入 id=100 的行,因为写入 id=110 的行的过程在写入记录 id=100 的进程之后开始,但首先提交。如果读取器已经读取了 id=110 的行,这可能会导致读取器丢失 id=100 的行。
强制写入者对表进行排他锁将解决问题,因为这将强制它们按顺序插入,并且还会让读取器等待任何未完成的提交。然而,这可能不会很快。
我的想法是,读者在阅读之前等待任何未完成的 Writer 提交就足够了。也就是说,只要 Reader 确实读取,Writers 就可以继续并发操作,直到所有 writers 完成。
我的问题是:
如何指示我的读者进程等待我的作家进程的任何未完成的提交?也欢迎对上述问题提出任何替代建议。