我正在设置一个每 15 分钟运行一次的 Cron 作业,如果特定表中有新数据,它将备份该表,通过电子邮件发送并删除它。
我是否必须担心数据将在备份运行的同时写入数据库,并且它将备份“一半”数据而不是删除其余数据?
如果您的工作如您所描述的那样运行,则存在新数据可能会在SELECT
用于生成电子邮件之后但在DELETE
.
防止这种情况的最简单方法可能是在事务中运行这两个语句,假设您使用的数据库引擎支持事务。
或者,一些数据库引擎支持从DELETE
单个原子事务中的语句返回数据 - Postgres 是一个,带有RETURNING
子句。
如果您无法使用该选项,另一种解决方案是DELETE
在源表中使用高水位日期/时间或自动递增标识列。实现这一点可能需要对源表进行架构更改。伪代码将类似于:
SELECT <variable> = max(<identity>)
FROM source_table
SELECT <columns>
FROM source_table
WHERE <identity> <= <variable>
DELETE source_table
WHERE <identity> <= <variable>
source_table
添加到第一个SELECT
和第一个之间的任何数据DELETE
都将具有比存储在更高的标识值<variable>
,因此不会被删除。