当前位置: 首页 > news >正文

postgresql|数据库|SQL语句冲突的解决

前言:

postgresql数据库是比较复杂的一个关系型数据库,而有些时候,即使是简单的插入更新操作也是有很多复杂的机制。

那么,什么是冲突?什么时候会遇到冲突(也就是冲突的常见场景)?如果有冲突我们应该怎么去解决?这些问题我想应该是在此文章中详细说明的。

一,

什么是冲突?

复杂点的说法:数据库的冲突主要是指并发事务对同一数据的读写操作和写写操作。例如,当多个用户同时尝试修改同一行数据时,可能会发生冲突。这种冲突可能会导致数据不一致或数据损坏。

解决这种并发冲突的方法有多种。其中一种是通过锁定整个行数据或整个表数据来防止并发错误,这分别被称为行锁和表锁。行锁的开销小,加锁快,但出现死锁的概率较高;表锁的锁定力度大,发生锁冲突的概率较低,但会导致并发度最低。

另外,乐观并发控制是另一种解决冲突的方法,它假设并发冲突相对较少。与悲观方法(预先锁定数据,然后再进行修改)相反,乐观并发不会进行锁定,但如果数据自查询后发生更改,则会安排数据修改在保存时失败。此并发失败会报告给应用程序,应用程序会进行相应处理,例如可能会对新数据重试整个操作。(这些也就是面试DBA的时候常说的悲观锁,乐观锁这些)

简单来说,就

假设有一个名为"employees"的表,其中包含以下列:id、name、age和salary。现在有两个并发事务,它们都试图更新同一个员工的薪水。

事务1:

 

BEGIN; UPDATE employees SET salary = 5000 WHERE id = 1; COMMIT;

事务2:

 

BEGIN; UPDATE employees SET salary = 6000 WHERE id = 1; COMMIT;

在这个例子中,事务1将员工的薪水从4000更新为5000,而事务2也将员工的薪水从4000更新为6000。由于这两个操作是并发执行的,因此最终的结果将是员工的薪水被更新为6000,而不是预期的5000。这就是一个典型的PostgreSQL冲突示例。

我们在使用SQLinsert语句进行插入 操作 ,而目标表中存在这些数据将会导致这些insert 的SQL语句失败, 这个时候,我们就可以说有冲突现象发生了。

例如:

二,

冲突在什么时候出现?

很简单,多用户同一时间执行同一个插入的SQL语句的时候,还一种情形是增量迁移,增量同步数据的时候,第二种情形应该是比较常见的。

三,

冲突的解决

  1. 悲观锁(Pessimistic Locking):悲观锁是一种并发控制策略,它假设多个事务在没有冲突的情况下同时执行的可能性很小,因此在每个事务开始时就会锁定数据行或表,直到事务完成并释放锁。这种机制可以有效地避免冲突,但会导致并发性能下降。

  2. 乐观锁(Optimistic Locking):乐观锁是一种并发控制策略,它假设多个事务在没有冲突的情况下同时执行的可能性很大,只有在提交时才会检查是否存在冲突。如果存在冲突,则事务会被回滚并重新尝试。这种机制可以提高并发性能,但需要额外的逻辑来处理冲突。

  3. 时间戳(Timestamping):时间戳是一种简单的并发控制策略,它在每个记录中添加一个时间戳字段,用于记录该记录的最后修改时间。当更新记录时,比较当前时间戳和记录中的时间戳是否一致,如果不一致则说明有其他事务已经修改了该记录,需要重新执行更新操作。

  4. 分布式锁(Distributed Locking):分布式锁是一种在分布式系统中解决并发冲突的机制,它可以确保只有一个节点能够访问共享资源。常见的实现方式包括基于Redis、Zookeeper等中间件实现的分布式锁。

  5. 重试机制(Retry Mechanism):重试机制是一种常见的解决冲突的方法,当某个操作失败时,会进行多次重试,直到成功为止。这种方法适用于一些非关键性操作,但对于关键性操作可能会导致数据不一致等问题。

  6. 忽视冲突  适用于上面第二节说的增量更新同步,迁移数据库的操作

示例1:

忽视冲突

例如,两张表之间的同步,虽然形式上是全表同步,但希望实现的效果是增量同步,此时,我们需要在INSERT语句后面添加冲突指示:on conflict DO NOTHING; 这样有相同的数据时,检查到了冲突,忽略掉此条数据插入,保持原有数据不变。

INSERT INTO 表1名 SELECT * FROM 表2名 on conflict DO NOTHING;

示例2:

冲突后update更新(部分冲突更新)

---表示在向名为table_name的表中插入一条数据,
---其中包含两个字段:column1和column2。
---如果表中已经存在具有相同column1值的记录,
---则将该记录的column2字段更新为新插入记录的column2值。INSERT INTO table_name (column1, column2)
VALUES (value1, value2)
ON CONFLICT (column1) DO UPDATE SET column2 = EXCLUDED.column2;

 示例3:

冲突后,根据条件更新字段

INSERT INTO table_name (column1, column2)
VALUES (value1, value2)
ON CONFLICT (column1) DO UPDATE SET column2 = EXCLUDED.column2 WHERE column2 < EXCLUDED.column2;

示例4:

DO NOTHING RETURNING:在发生冲突时不执行任何操作,若不冲突返回插入的行。

INSERT INTO table_name (column1, column2)
VALUES (value1, value2)
ON CONFLICT (column1) DO NOTHING RETURNING *;

示例5:

DO UPDATE SET ... WHERE ... RETURNING:在发生冲突时执行更新操作,并根据条件进行更新,并返回更新的行 

INSERT INTO table_name (column1, column2)
VALUES (value1, value2)
ON CONFLICT (column1) DO UPDATE SET column2 = EXCLUDED.column2 WHERE column2 < EXCLUDED.column2 RETURNING *;

未完待续!!!

相关文章:

postgresql|数据库|SQL语句冲突的解决

前言&#xff1a; postgresql数据库是比较复杂的一个关系型数据库&#xff0c;而有些时候&#xff0c;即使是简单的插入更新操作也是有很多复杂的机制。 那么&#xff0c;什么是冲突&#xff1f;什么时候会遇到冲突&#xff08;也就是冲突的常见场景&#xff09;&#xff1f;…...

overflow溢出属性、定位、前端基础之JavaScript

overflow溢出属性 值 描述 visible 默认值。内容不会被修剪&#xff0c;会呈现在元素框之外。 hidden 内容会被修剪&#xff0c;并且其余内容是不可见的。 scroll 内容会被修剪&#xff0c;但是浏览器会显示滚动条以便查看其余的内容。 auto 如果内容被修剪&#xff0…...

【JS】Chapter6-Dom 获取属性操作

站在巨人的肩膀上 黑马程序员前端JavaScript入门到精通全套视频教程&#xff0c;javascript核心进阶ES6语法、API、js高级等基础知识和实战教程 &#xff08;六&#xff09;Dom 获取&属性操作 以下的变量可以将 let 改为 const&#xff1a; let arr [red, green] arr.pu…...

太极培训机构展示服务预约小程序的作用如何

太极是适合男女老幼的&#xff0c;很多地方也有相关的学校或培训机构&#xff0c;由于受众广且不太受地域影响&#xff0c;因此对培训机构来说&#xff0c;除了线下经营外&#xff0c;线上宣传、学员获取和发展也不可少。 接下来让我们看下通过【雨科】平台制作太极教培服务预…...

node使用path模块的基本使用

文章目录 一、path.resolve(常用)二、path.sep三、path.parse其他 一、path.resolve(常用) 由于node 中使用 __dirname 获取的绝对路径是/ ,而我们拼接的路径为‘/’导致路径不统一。 作用&#xff1a;拼接规范的绝对路径 const fs require(fs) const path require(path)// 1…...

我和云栖大会有个约会

前言 云栖大会&#xff08;Alibaba Cloud Computing Conference&#xff09;是中国阿里巴巴集团旗下的云计算技术盛会&#xff0c;旨在推动云计算技术的发展和应用。该大会自2009年首次举办以来&#xff0c;已成为云计算行业内规模最大、影响力最广的会议之一。 云栖大会每年…...

Linux各个发行版之间的关系

Linux各个发行版之间的关系 可以查看链接&#xff1a;Linux Timeline 链接中可以下载PNG或者SVG图片...

第一章 第一行Android代码

一、Android简介 1.android系统架构 linux kernel&#xff08;Linux内核层&#xff09;&#xff1a;提供硬件底层驱动 libraries&#xff08;系统运行库层&#xff09;&#xff1a;提供了主要的特性支持&#xff0c;如SQLite库、Webkit库&#xff1b;还包含android runtime&…...

怎样利用 AI 大模型,辅助研发管理与效能提升?

AI 大模型已经逐渐渗透到各行各业的应用场景中&#xff0c;在软件研发领域也不例外。在软件研发领域&#xff0c;从需求分析到软件设计&#xff0c;从软件开发到测试&#xff0c;以及最后发布上线&#xff0c;AI 在各个环节都发挥着重要作用。10 月 21 日&#xff0c;思码逸首席…...

聊天室的创建

要创建一个聊天室&#xff0c;您需要&#xff1a; 确定聊天室的主题和目的。 选择一个适当的聊天室平台或应用程序&#xff0c;如Discord、Slack、Zoom等。 注册一个账户并创建一个聊天室。 添加您的朋友或家人或需要的人到聊天室中。 设置聊天室的规则和管理机制&#xff…...

大数据信息抽取

随着互联网的广泛应用和技术的不断进步&#xff0c;海量数据被产生、存储和共享。这些数据中包含着宝贵的的信息和知识&#xff0c;二大数据信息抽取是正是为了把这些数据中关键、有用的信息提取出来。 大数据信息抽取就是指通过自动化的方式&#xff0c;从大数据中提取有异议…...

驱动开发11-1 编写IIC驱动-读取温湿度数据

头文件 head.h #ifndef __HEAD_H__ #define __HEAD_H__ #define GET_HUM _IOR(m, 1, int) #define GET_TEM _IOR(m, 0, int) #endif 应用程序 si7006.c #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #inc…...

上海中优城市万豪酒店推出全新国际IP童趣主题房,独特住宿体验中国首秀

2023年10月30日&#xff0c;中国上海 – 近日&#xff0c;上海中优城市万豪酒店正式推出由全球品牌娱乐公司孩之宝官方授权打造的小马宝莉和变形金刚主题客房&#xff0c;以创意客房、新奇体验和丰富礼遇&#xff0c;为童游家庭或年轻的动漫迷们开启沉浸式入住之旅&#xff0c;…...

zsh和bash之间互相切换

zsh->bash exec bashbash->zsh exec zsh...

Java - window系统快捷键大全

Ctrl 快捷键 介绍 Ctrl F 在当前文件进行文本查找 &#xff08;必备&#xff09; Ctrl R 在当前文件进行文本替换 &#xff08;必备&#xff09; Ctrl Z 撤销 &#xff08;必备&#xff09; Ctrl Y 删除光标所在行 或 删除选中的行 &#xff08;必备&#xff09; Ctrl X …...

深入理解数据结构(1)—用链表实现栈

栈是一种数据结构&#xff0c;链表也是一种数据结构。它们都是由基础的语法实现的。 如果一个数据结构可以用另外的数据结构来实现&#xff0c;那么可以有力的证明——“数据结构是一种思想”&#xff0c;是一种讲语法组合起来实现某种功能的手段 一、栈的特点——要实现哪些功…...

Jtti:debian安装firewalld错误怎么办

如果在Debian系统上安装Firewalld时出现错误&#xff0c;可以尝试以下步骤来解决问题&#xff1a; 更新软件包列表&#xff1a; 首先确保您的Debian系统的软件包列表是最新的。运行以下命令&#xff1a; sudo apt update 安装Firewalld&#xff1a; 使用以下命令安装Firewalld&…...

如何理解python中的*args和**kwargs

args用于表示可变数量的位置参数&#xff08;Positional Arguments&#xff09; kwargs 用于表示可变数量的关键字参数&#xff08;Keyword Arguments&#xff09;。 *args 来接收不定数量的位置参数 实例: def exampleFunc(*args):print(type(args))for arg in args:print…...

软考之软件工程基础理论知识

软件工程基础 软件开发方法 结构化方法 将整个系统的开发过程分为若干阶段&#xff0c;然后依次进行&#xff0c;前一阶段是后一阶段的工作依据按顺序完成。应用最广泛。特点是注重开发过程的整体性和全局性。缺点是开发周期长文档设计说明繁琐&#xff0c;工作效率低开发前要…...

香港服务器不稳定的几种情况

​  近年来&#xff0c;随着互联网的迅猛发展&#xff0c;香港作为一个重要的网络枢纽地区&#xff0c;扮演着连接中国内地和国际网络的重要角色。一些用户表示在使用香港服务器时可能会遇到不稳定的情况&#xff0c;导致访问困难、加载缓慢甚至无法连接。 为什么香港服务器会…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...