【问题标题】:Finding out when a line has been modified in a H2 database table找出 H2 数据库表中的行何时被修改
【发布时间】:2011-05-26 18:39:10
【问题描述】:

假设我有两个进程 A 和 B 在 H2 数据库表 T 上执行事务。

进程 A 在 T 上执行 CRUD(创建、读取、更新、删除)。

进程 B 想知道 T 中的 L 行最后一次修改的时间(例如,B 提供了一个System.currentTimeMillis() 值)。

可以在 T 中创建一个列来记录每一行的最后修改时刻,但我想知道 H2 是否已经在某处保存了此信息以及是否可以访问它。

【问题讨论】:

    标签: java database line h2 last-modified


    【解决方案1】:

    据我所知,H2 中没有这样的功能(可能在任何 RDBMS 中都没有)。原因很简单——每条记录额外增加 4 或 8 个字节可能会对整个数据库大小产生巨大影响,尤其是对于小记录。也会对性能产生轻微影响。

    但是通过使用额外的列和更新触发器来实现此功能相对简单。还有一些数据库可能会进一步简化它,比如 MySQL:

    ts TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP
    

    另外请区分数据库服务器时钟、进程A时钟和进程B时钟。在现实世界中,它们很可能不会相同。

    【讨论】:

    • 我想下一步对我来说是找出这是否可以自动化。谢谢。
    • src/test/org/h2/samples中有一些触发示例。
    【解决方案2】:

    数据库仅存储您设置的内容。

    所以你必须设置表来存储修改时间,一个非常简单的方法是创建一个值为now()的“计算列”,每次记录时都会计算一个计算列修改。

    CREATE TABLE TEST(ID INT, NAME VARCHAR, LAST_MOD TIMESTAMP AS NOW());
    

    仅供参考:http://www.h2database.com/html/features.html#computed_columns

    【讨论】:

      猜你喜欢
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-11
      • 2018-06-13
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      相关资源
      最近更新 更多