![]() |
1
1
有趣的问题。听起来你在建立一个很好的解决方案。
一些建议… 编写器状态您可以创建一个表writer_status,它有一个last_id字段:每个writer在使用要写入日志的id进行写入之前更新此表,但前提是其id大于last_id的当前值。 读者也检查了这个表,现在知道是否有作者还没有写过。 读者日志
这可能更有效率。
|
![]() |
2
1
您可能希望在读卡器进程中对表设置独占锁。这将等到所有写入程序完成并释放其行锁,以便您可以确保没有未完成的写入程序事务。 |
![]() |
3
1
我不会做任何锁定,这会干扰并发性和吞吐量。 如果您逐行跟踪已处理的日志行,那么也不需要reader_status表。 我要做的是:在日志表中添加一个新列。例如,将其称为“已处理”。将其设为布尔值,默认值为false(或小整数,默认值为0或其他值)。写入程序在插入时使用默认值。 当读卡器查询下一个要处理的记录块时,他查询处理为false且id值较低的行。
当他处理它们时,读者使用update将处理的结果从false更改为true。因此,下次读者查询一个记录块时,他肯定不会得到已经处理过的行。
此更新不应与写入程序执行的插入操作冲突。 如果有任何行是由其他写入程序按顺序提交的,则读取器在下次查询时将看到这些行,前提是他总是按id列从最低值到最高值的顺序处理这些行。 |
![]() |
4
0
既然你知道
|
![]() |
5
0
我同意AJ的解决方案( link )此外,以下建议可能有助于减少孔的数量。
1)使用
2)使用
这两个步骤将大大减少孔的数量。仍然存在这样一种可能性:一些插入首先开始,但随后提交,中间发生了读取操作。 |
|
Johnny T · 基于当前值的SQL合并表[重复] 4 月前 |
![]() |
John D · 需要为NULL或NOT NULL的WHERE子句 5 月前 |
![]() |
ojek · 如何对SQL结果进行分组和编号? 5 月前 |
![]() |
senek · 如何在PL/SQL中将选择结果(列)放入数组中 5 月前 |
![]() |
Sax · 规范化Google表格(第一步) 5 月前 |
![]() |
Jatin · 检索卷计数的动态sql抛出错误语法错误[关闭] 5 月前 |
![]() |
Andrus · 如何在sql中查找第二个匹配项 5 月前 |