首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

PostgreSQL事务快照

PostgreSQL有一个导出和导入事务快照的功能,大多数人都不了解甚至不知道它的存在。

文档写得很清楚,但它并没有真正描述为什么人们需要这个功能 。首先,什么是“快照”? 您可以将快照视为数据库中当前提交的元组集,即数据库的一致视图。 当您启动事务并将其设置为模式时,即使其他会话提交事务,快照在整个事务中也保持一致。 (在默认事务模式下,,每个语句都会启动一个新快照,因此新提交的工作可能出现在事务中的语句之间。)但是,每个快照都是单个事务的本地快照。 假设您想编写一个在多个会话中连接到数据库的工具,并进行分析或提取。由于每个会话都有自己的事务,并且事务彼此异步启动,因此它们可能具有不同的数据库视图,具体取决于提交的其他事务。 这可能会产生不一致或无效的结果。这不是理论上的:假设您正在使用类似的并行转储工具。 如果不同的会话获得了数据库的不同视图,则生成的转储将不一致,这将使其备份工具无法使用!好消息是我们能够“同步”各种会话,以便它们都使用相同的基本快照。首先,事务打开并将自身设置为或模式(在模式下执行导出快照没有意义,因为快照将在下一个语句中被替换)。 然后,该会话调用。 这将为当前事务快照创建标识符。然后,运行第一个会话的客户端将该标识符传递给将使用它的客户端。 您需要通过一些非数据库通道执行此操作。 例如,您不能使用/,因为直到时间才会实际发送消息。然后,每个接收快照ID的客户端都可以执行以使用快照。 客户端需要在会话中执行任何工作之前调用它(即使是)。 现在,每个客户端对数据库具有相同的视图,并且该视图将保持到或为止。请注意,每个事务仍然是完全自治的; 各种会话不在同一交易的“内部”。 他们无法看到彼此的工作,如果两个不同的客户端修改数据库,那么任何其他会话(包括共享快照的会话)都不会看到这些修改。您可以将快照视为数据库的“基本”视图,但每个会话都可以对其进行修改(当然,主题是修改相同元组或获取序列化失败所涉及的常规规则)。当然,这是一个非常专业的用例; 没有多少应用程序需要具有一致的数据库视图的多个会话。 但是,PostgreSQL可以做到这一点!

本文翻译自:https://thebuild.com/blog/2019/02/11/whats-up-with-set-transaction-snapshot/

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190807A0IHSX00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券