我有一个遗留API应用程序,它通过特定日期的API调用获取大量JSON数据。
为了使用新信息更新数据库,我必须删除与该日期相关的所有行,然后循环并插入所有新行。每个日期约1200行。插件需要作为一个“循环”来完成。因为JSON数据需要在每一行上完成额外的工作。
这种情况经常发生 - 大约每5分钟发生一次。
在此期间 - 有用户定期全天候访问当前数据。我有报告称,有时加载报告时,没有数据,或者数据似乎不完整。
我受过教育的猜测是,他们正在删除和重新加载'之间访问报告。数据的。我怎样才能确保无缝地发生这种情况?
我需要知道的是,数据库事务会解决此问题吗?我知道如果出现问题,DB Transactions允许在操作期间回滚 - 但它们是否也允许在一个事务中进行无缝删除和更新?
即。像这样的东西
try {
$db->beginTransaction();
$db->query('delete query');
$db->query('insert query');
$db->commit();
} catch (Exception $e) {
$db->rollback();
}
答案 0 :(得分:1)
有一件事是将数据进程锁定在数据库中,例如mysql可以按行锁定。
另外,在mysql中,你可以一次性写入存储过程到exe的所有插入和删除,并且在执行期间其他函数无法访问数据。
答案 1 :(得分:1)
首先,您需要使用InnoDB。 MyISAM无法处理除LOCK TABLE
之外的任何类型的交易,这会使您的用户陷入困境。
其次,请确保您的表格已正确编入索引,以使DELETE
查询不会变得愚蠢 - 也就是说,不进行全表扫描。可能这意味着索引一些DATE或DATETIME字段。
第三,不要这样删除:
DELETE FROM table WHERE DATE(timestampcol) = '2014-01-01'
而是这样做:
DELETE FROM table WHERE timestampcol = '2014-01-01'
或者,如果您的timestampcol
包含日期和时间(即包含非午夜时间),请确保您可以像这样使用索引:
DELETE FROM table WHERE timestampcol >= '2014-01-01'
AND timestampcol < '2014-01-01' + INTERVAL 1 DAY
第五,使用交易进行此操作。这基本上就在你的问题中。
第六,有没有什么方法可以UPDATE
行,而不是DELETE
和INSERT
?您是否可以逐行完成此工作而不会破坏用户阅读的数据的完整性?如果可以的话,这可能是一种在用户&#39;之下更改日期的方法。鼻子&#34;在交易完成时不让他们等待。
第七:这更难:您可以使用分区表,并在您更新的那一天换掉分区。如果每个分区只有1200行,那么对于您正在做的事情来说,这可能是一个巨大的过度杀伤。但它会以编程和系统管理员的麻烦而扩大规模。
答案 2 :(得分:0)
我认为数据库交易不会解决问题。在您的情况下,因为您删除了所有数据:您可以通过执行&#34;截断表&#34;来加速删除语句。截断表更快,因为它不会保留日志。
请记住: 截断将通过自动增量重置PK的计数器