如何避免长事务中的表损坏

时间:2012-11-20 07:58:42

标签: database database-design firebird

我有两个表stok和stok_detail。表库存是表stock_detail的摘要。

stok由3列组成:item_id,qty和cost

股票明细由5列组成:transaction_id,posting_date,item_id,qty和cost。

当有人编辑某个交易时,可能会重新计算成本。

e.g。在日期10采购编辑交易将重新计算日期10之后的所有后续交易成本。

我已将所有计算都放在存储过程中。

问题是,如果要重新计算许多事务,此事务可能需要数小时。并且在某些情况下,当事务运行时,电源会降低,这有时会导致stock_detail表被破坏。

我的问题是:

最好先将计算放在临时表上。例如stock_calc。 当完成所有计算后,将更新表stock_detail,从stock_calc中获取值。因此,在完成所有计算后,表stock_detail会更新。

因此,如果出现问题,我只需要清空表stock_calc。我知道当交易更新stock_detail时,电源可能会下降。但概率将最小化。这当然会使计算时间更长。但如果它更安全,我可能会考虑这种方法。

你觉得怎么样?任何评论和想法将受到高度赞赏。

还有一件事。如果电源关闭,是否有可能在重新连接数据库时看到所有未提交的事务和提交/回滚?

1 个答案:

答案 0 :(得分:1)

Firebird的构建考虑了ACID的关注度。这意味着“理论上”即使在网络或电源(硬件除外)故障上,您的数据库也应保持其完整性。

但是,存在数据损坏的情况,尤其是在硬件故障或Firebird引擎编程错误方面。您应该将FB版本升级到主要版本的最新版本。

此外,将事务保持活动数小时以改变大量数据并不是一个好的架构设计,请避免这种情况。