0

我正在设置一个每 15 分钟运行一次的 Cron 作业,如果特定表中有新数据,它将备份该表,通过电子邮件发送并删除它。

我是否必须担心数据将在备份运行的同时写入数据库,并且它将备份“一半”数据而不是删除其余数据?

4

1 回答 1

0

如果您的工作如您所描述的那样运行,则存在新数据可能会在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>,因此不会被删除。

于 2012-08-01T16:15:01.543 回答