gpt4 book ai didi

sql - 多进程写入的事务封装

转载 作者:行者123 更新时间:2023-12-04 07:12:08 30 4
gpt4 key购买 nike

我有一个数据库场景(我使用的是 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 的进程之后开始,但首先提交。如果 Reader 已经读取了 id=110 的行,这可能会导致 Reader 丢失 id=100 的行。

强制写入器对表进行排他锁将解决问题,因为这将强制它们按顺序插入,并且读取器等待任何未完成的提交。然而,这可能不会很快。

我的想法是,读者在阅读之前等待任何优秀的 Writer 提交就足够了。也就是说,只要 Reader 确实读取,Writer 就可以继续并发操作,直到所有 writer 都完成为止。

我的问题是这样的:
我如何指示我的读者进程等待我的作者进程的任何未完成的提交?也欢迎对上述问题提出任何替代建议。

最佳答案

有趣的问题。听起来您正在构建一个不错的解决方案。
我希望我能帮上忙。
几个建议...
作家状态
您可以创建一个表 WRITER_STATUS,它有一个 last_id 字段:每个写入器在写入它要写入日志的 ID 之前更新该表,但前提是它的 ID 大于 last_id 的当前值。
读者也检查这个表,现在知道是否有任何作者还没有写。
读者日志
这可能更有效。
读取器读取后,它会检查检索到的记录中是否存在任何漏洞。
然后它将任何丢失的 ID 记录到 MISSING_IDS 表中,并在下次读取时执行类似的操作

SELECT *
FROM TRANSACTION_LOG
WHERE id > (SELECT last_id
FROM READER_STATUS)
OR id IN ( SELECT id from MISSING_IDS )

关于sql - 多进程写入的事务封装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/152243/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com