1
3
未指定正在使用的数据库,因此不清楚是否必须将解决方案锤击到现有部署中。有一些队列引擎可以插入到MySQL中,它们可能会工作。其中一个是 Q4M .一些商业数据库(如Oracle)具有时间数据库功能,允许确定事务时间与有效时间与实时时间之比。
使用Oracle时,伪列
您还可以通过将时间戳概念与提交时间启发式方法相结合,在一定程度上伪造该功能。其思想是简单地将“有效时间”与数据一起存储为一列,而不是从现在开始使用任意增量()。换句话说,一个二级时间戳列,它将基于提交时间+一些可接受的延迟窗口(可能是平均提交时间+标准偏差的两倍)的启发式,指定未来的某个日期(“有效时间”)。或者,使用一些平均提交时间的ceil()ing(“至少是提交时间,但四舍五入为30秒间隔”)。后者将有效地量化(合并?)将读取时间日志记录。它看起来并没有太大的不同,但是这样可以避免您阅读多余的行。它还解决了读取应用程序在不编写更多代码的情况下无法准确地知道写入应用程序的提交时间的问题。 |
2
4
MS SQL有其特定的解决方案: 您可以添加一列 划线 表的数据类型。引擎将在任何更新/插入语句中自动更新相关行上的此列。
如果作者使用
在哪里?
因此,对于这个解决方案,即使您提交了id=4但id=3还没有提交,它也只返回id=3之前更改过的行,因为它的版本
这种方法的优点是,在得到任何结果之前,读者不需要等待事务被提交,如果有很多作者,那么什么是至关重要的。(读者可能永远被锁定。) |
3
0
这是一个可能的解决方案,取决于您的情况等。 有一个名为“read_timestamp”的列,该列为空,一旦读取了一行,读取过程就会将其更新为非空时间戳。 读卡器用“where read_timestamp is NULL”查询该表。 一个简单的解决方案是使用一个估计(即此行 可能已经看过了 有点小题大做)。因此,您可以随时显示“最后50行”或“最后10分钟到达的行”(不准确的是,另一个日志查看器可能已经提取了这些行)。 第三种解决方案是使用后端进程将这些行送入队列:每读取一行都会使该行从队列中消失(因为它是一个“pop”操作)。因此,一行只能查看一次(先到先得)。 |
4
0
我想说你关于时间戳的想法是有效的,但与其要求范围,不如要求所有的值 之后 一段时间。你应该得到所有 可获得的 数据库中您最近选择的时间段内的值。显然,对于任何仍在进行中但尚未记录的事务,它都不起作用…但是您只需要执行一个简单的查询。
编辑:
|
5
0
创建另一个表
日志记录进程应该读取这个表,并将找到的数字添加到每个日志记录中。在提交事务之前锁定行。
阅读过程应首先更新
[编辑]还有两种解决方法:
|
6
0
为日志表创建一个ID序列,以便每个日志都有一个唯一的ID。然后当读卡器读取日志时,它将在某个位置记录读取的最高ID。下次运行时,它将在最后一个记录的ID之后获取所有ID。任何正在进行的事务都不会成为问题,因为您没有在结果集中获取它们。他们将在下一次跑步中集合。 如果你有:
然后您将获取所有这些日志,并将3记录为找到的最后一个ID。下一次跑步时: 选择ID,从日志中记录,其中ID>上次记录的ID按ID排序为3
把6号记录为你最后一次记录的新身份证。我仍然认为最好保留记录的日期。 编辑“确定”以捕获类似的每件事情,您必须在另一个位置保留一组读取的所有记录,然后获取读取集与活动日志表之间的差异。如果您不能接触到日志表,那么您只需要处理集合,并查找其中一个集合中不存在的内容。 |
Michael Samuel · MYSQL在以下情况下自动创建索引 6 年前 |
Patricia Rozario · 数据库设计确保一对一关系 6 年前 |
dryhay · MySQL“多对多”关系错误 6 年前 |
L. Fox · 我在这里用的是什么样的Laravel雄辩的关系 6 年前 |
Geoff Harper · 我应该如何构建关系松散的SQL db 6 年前 |
waroxx · SQL—当多个表具有相同的列时,最好怎么做 6 年前 |
Lumpi01 · SQL 2不同的注释类型-最佳解决方案? 6 年前 |
Hayreddin Tüzel · 预约系统数据库建模[关闭] 6 年前 |