【问题标题】:Could I save Postgres transaction and continue work with db within it later我可以保存 Postgres 事务并稍后在其中继续使用 db
【发布时间】:2014-07-16 10:48:22
【问题描述】:

我知道 Postgres 中准备好的事务,但似乎您可以稍后提交或回滚它。在提交之前,您甚至无法查看事务的数据库状态。有什么办法可以保存交易以备后用?

我实际上想要实现的是对 db 中一些更改的预览(和更正)(更改是从 csv 文件导入的,因此用户需要在应用之前查看预览)。我想进行更改,稍后添加一些更改,查看 db 的完整状态并应用它(当然,提交事务)

【问题讨论】:

  • 解决此问题的通常方法是将 CSV 数据导入临时表,然后运行使用临时表而不是真实表的 SQL 查询来“预览”更改。
  • 这个相关的答案可能会有所帮助:stackoverflow.com/questions/12502669/…COPY 到临时临时表并从那里继续......)

标签: postgresql transactions


【解决方案1】:

我在文档中找不到很好的参考,但我有一种强烈的感觉,答案是:不,你不能这样做

这意味着当您“保存”事务时,数据库基本上必须无限期地维持其所有锁定。即使有可能,也意味着可怕的失败模式和各方面的麻烦。

对于您所描述的模式,我将使用两个单独的事务。导入到临时表并向用户显示(或导入到主表但将行标记为“未批准”)。如果用户批准,则在另一个事务中移动或更新这些行。

您总是会遇到用户无需单击“确定”或“取消”即可直接离开或崩溃的情况。如果您所描述的内容是可能的,那么您最终会得到一个持有所有这些资源的挂起事务。在我提出的解决方案中,您最终会在“暂存”表中出现浪费的行,您以后可能仍会向用户显示或删除这些行。

您可能想阅读持久性传奇。这实际上是一个众所周知和研究过的问题的非常简单的例子。

长话短说,这种模式将像您这样的长期运行的流程分解为更小的操作,这些操作以某种方式在单独的事务中应用和持久化。如果其中任何一个碰巧失败(或未按预期发生),您将采取补偿措施,这些措施通常会撤消迄今为止执行的步骤所做的事情(例如,通过丢弃陈旧/不相关的数据)。

这是一个不错的介绍:

这个概念是在 80 年代正式引入的,但在今天仍然很活跃。

【讨论】:

  • 顺便说一句,什么是持久性传奇?我用谷歌搜索的是关于 NServiceBus 的内容,是吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多