【问题标题】:Mysql InnoDB table to elasticsearch: ON UPDATE CURRENT TIMESTAMP inside transactionMysql InnoDB表到elasticsearch:ON UPDATE CURRENT TIMESTAMP inside transaction
【发布时间】:2025-12-17 22:25:02
【问题描述】:

我想让我的 MySQL 数据库表与相应的 elasticsearch 索引保持同步。我正在尝试编写自己的 cron 工作。 MySQL 表具有 InnoDB 引擎。我添加了updated_at 列,即CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。我使用这个查询来执行同步:

SELECT * FROM table WHERE updated_at>=bookmark;

我测试了它,发现一些插入丢失了。

CURRENT_TMESTAMP 是在 COMMIT 之前计算的吗?

【问题讨论】:

    标签: mysql elasticsearch


    【解决方案1】:

    CURRENT_TIMESTAMP——NOW() 的同义词——在调用它的查询开始执行时捕获它的值。无论查询运行多长时间,这些函数都保持一个恒定值——因此在长时间运行更新等情况下,所有受影响的行都将具有相同的值,并且该值应该是每个单独的查询开始执行的时间——而不是提交时间。

    NOW() 返回一个常数时间,表示语句开始执行的时间。 (在存储的函数或触发器中,NOW() 返回函数或触发语句开始执行的时间。)这与 SYSDATE() 的行为不同,SYSDATE() 返回其执行的确切时间。

    https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_now

    【讨论】: