kar*_*yon 5 database postgresql transactions
我们正在运行一个评估平台,用户可以在其中评论某些事情。一个关键功能是人们只能评论一次,并且每个评论都是匿名的。
我们将Postgres用于所有数据。我们想在用户创建评论的数据库中保存一个标志(因此他们不能再次发表评论)。在一个单独的表中但在同一事务中,我们希望保存注释本身而不与用户建立任何链接。
然而,postgres的保存插入到数据库中(每元组的事务ID xmin
的的系统列)。因此,现在我们必须避免用户与他们的评论之间存在链接!
可能的(非)解决方案
单独执行清理操作无济于事,因为它不会清除事务ID。请参阅postgres文档中 “ 24.1.5。防止事务ID环绕失败”部分中的“注释”框。
将这些插入内容放入不同的事务中并不能解决任何问题,因为事务ID是连续的。
我们可以将多个用户的评论聚集到带有分隔符的数据库中的一个大文本中,但是由于postgres至少会保留该大文本的旧版本,直到下一个真空,这似乎并不是一个完整的解决方案。此外,我们仍然可以按照用户添加评论的顺序排列,这很好,也可以不保存。
定期重新写入这些表中的所有元组(通过对它们全部进行虚拟UPDATE),然后进行清除操作可能会充分擦除“插入历史记录”,但这似乎也很粗糙。
postgres中是否还有其他方法无法重建表的插入历史记录?
也许您可以使用类似dblink
或 的东西postgres_fdw
通过远程连接(到当前数据库或另一个数据库)写入表,从而分离xmin
值,即使您作为用户认为您是在“同一事务”中完成这一切。
关于通过逆向工程连续 xmin 值进行跟踪的担忧,由于 dblink 是异步的,因此当许多用户同时向系统添加评论时,这个问题可能会变得毫无意义。如果您需要在遇到错误后回滚\xe2\x80\x94,这可能不起作用,这实际上取决于将操作限制在一个事务中的重要性。
\n 归档时间: |
|
查看次数: |
91 次 |
最近记录: |