我来自SQL Server,在那里我知道MERGE命令需要一些额外的照顾,比如锁定提示,才能成为原子操作,现在我开始使用PostgreSQL.现在我想在PostgreSQL中使用MERGE命令,知道SQL Server中的问题,我做了一个快速的研究,并查看了文档,看看PostgreSQL中的MERGE命令是否是原子设计的,或者是否需要类似的东西.

如果有任何不同,该命令将不会直接使用,而是在存储过程中使用.目前使用的是PostgreSQL 15.

好吧,我没有找到答案,只有一些博客提到了一些文字流中的东西,但没有具体的内容.

澄清

"原子的意思有点短,我指的是ACID,所以让我用NOT ACID重新表述MERGE.MERGE的作用类似于多个语句一个接一个地运行,不能保证这个命令的每个操作都是针对相同版本的数据进行的.因为其他语句可以同时修改它们.单个UPDATE语句(当然没有SUB SELECT)是ACID,因为只要语句一开始执行,底层数据就不会被其他语句更改,直到UPDATE语句完成.

推荐答案

如果在默认的READ COMMITTED隔离级别上运行MERGE,并发数据修改可能会导致事务异常,如"丢失更新".该语句将始终是原子的,因为它要么成功完成,要么没有效果.

请注意,这与UPDATE没有本质上的区别:例如,参见this article.而这样的事情可以通过修改几行的单个UPDATE来实现.

避免异常的唯一可靠方法是使用更高的事务隔离级别:如果您需要绝对确定性,则使用SERIALIZABLE,但通常REPEATABLE READ就足够好了,它可以防止并发数据修改导致更新丢失.

另一种 Select 是锁定视线内的一切,这通常是不受欢迎的.

Sql相关问答推荐

调用存储过程时SQL服务器TDS协议响应问题

为什么Postgrs Planner会在输出部分中显示我在查询中不使用的列?'""

在Oracle中,如何删除具有特定值的行,仅当它是重复的行?

Django将字符串筛选为整数?

将Dense_RANK列为聚合(非解析)函数(&A)

SQL计数条目大于日期,包括交叉表中的零

如何设计一个调用嵌套函数并仅在所有被调用的嵌套函数都提交时才提交的事务,例如,如果一个子函数失败则中止?

根据Rails活动记录中时间戳/日期时间的时间部分从PostgreSQL中提取记录

如何使用SQL生成数据的滚动3天总和

将最近的结束日期与开始日期相匹配

试图找到两个身份列表的交集(列表的长度不同),但获取列 id 不明确?

Clickhouse:左连接表到外部数组

BigQuery导航函数计算ID

如何在插入时将字符串'03-January-2023'转换为日期时间

SQL 按 id 运行总计并受条件限制(在窗口上)

获取 SQL Server 中每一行的两个-之间的文本

SQL:如何从时间戳数据生成时间序列并计算不同事件类型的累计总和?

CURRENT_ROW 窗口框架上的 SQL 滞后

pyspark 将列转换为行

SQL 中的问题与包含最大日期的记录连接