gpt4 book ai didi

database-design - 仅从数据库中的类似日志的表中读取新行

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

我们有这样的情况,即有几台服务器将大块的行插入到关系数据库的表中,并且一台服务器不时从表中读取新数据。 (该表在概念上是某种日志文件 - 数据仅插入但从未修改,读取服务器显示日志的尾部。)有没有办法让读取服务器只读取新数据?我们可以根据需要自由构建表。

我想到但不起作用的一些想法是:

  • 将行标记为已读不适合我们的应用程序:读取服务器不应更改数据库。 (写入数据库用于显示内容不是一件好事,可能会有多个 session 显示这些内容。)
  • 我们可以在填充了数据库系统时间的每一行中插入一个时间戳。问题是这不是提交时间的时间戳,而是插入时间的时间戳。如果您询问数据库“给我现在-5 分钟和现在之间的所有值”,您不能依赖所有值都存在,因为可能有正在进行的事务。稍后您将不得不再次询问此间隔中的值,这是我想要避免的。
  • 我们可以插入一个从序列填充的运行行数。运行事务时会出现与使用时间戳相同的问题。

  • 是否有任何解决方案,或者我是否必须应用一些启发式方法,例如假设最大事务时间并始终要求在“现在 - 最大事务时间”之后写入值并读取一些数据两次?

    以防万一:我们为此使用 Oracle。但我认为仅适用于其他数据库的答案也具有普遍意义。

    最佳答案

    MS SQL 有其特定的解决方案:

    您可以添加一列行版本表的数据类型。此列将在任何更新/插入语句中由引擎自动更新相关行。

    如果作者使用 ReadCommitted隔离级别然后读者可以使用ReadUncommitted隔离级别(因此在返回任何结果之前不需要等待所有事务结束)但是查询如下:

    SELECT * FROM [Log]
    WHERE Version > @LastKnownVersion
    AND Version < MIN_ACTIVE_ROWVERSION()

    哪里 @LastKnownVersion是读取器处理的最大行版本, MIN_ACTIVE_ROWVERSION()是一个内置的 MS SQL 函数,它返回仍在事务中的最小行版本号。

    因此,使用此解决方案,即使您已提交 ID=4 但尚未提交 ID=3,它也只会返回 ID=3 之前更改的行,因为它的版本将是 MIN_ACTIVE_ROWVERSION() .

    这种方法的优点是读取器不需要等待事务提交才能获得任何结果,如果有很多写入器,这可能是至关重要的。 (阅读器可能会被永远锁定。)

    关于database-design - 仅从数据库中的类似日志的表中读取新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1914675/

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