我有两个表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时,电源可能会下降。但概率将最小化。这当然会使计算时间更长。但如果它更安全,我可能会考虑这种方法。
你觉得怎么样?任何评论和想法将受到高度赞赏。 还有一件事。如果电源关闭,是否有可能在重新连接数据库时看到所有未提交的事务和提交/回滚?答案 0 :(得分:1)
Firebird的构建考虑了ACID的关注度。这意味着“理论上”即使在网络或电源(硬件除外)故障上,您的数据库也应保持其完整性。
但是,存在数据损坏的情况,尤其是在硬件故障或Firebird引擎编程错误方面。您应该将FB版本升级到主要版本的最新版本。
此外,将事务保持活动数小时以改变大量数据并不是一个好的架构设计,请避免这种情况。