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

PostgreSQL 和Oracle锁机制对比

PostgreSQL 和Oracle锁机制对比

PostgreSQL 和 Oracle 都是业界广泛使用的关系型数据库管理系统,它们在锁机制方面都有独到的设计来控制并发访问,确保数据的一致性和完整性。下面我们详细比较一下这两个数据库系统的锁机制。

1. 锁类型

PostgreSQL

PostgreSQL 支持多种类型的锁,包括行级锁和表级锁:

  • 行级锁(Row-Level Locks)

    • 行共享锁(Row Share Lock, RS)
    • 行排他锁(Row Exclusive Lock, RX)
  • 表级锁(Table-Level Locks)

    • Access Share Lock
    • Row Share Lock
    • Row Exclusive Lock
    • Share Update Exclusive Lock
    • Share Lock
    • Share Row Exclusive Lock
    • Exclusive Lock
    • Access Exclusive Lock
Oracle

Oracle 也支持多种锁,包括行级锁和表级锁:

  • 行级锁(Row-Level Locks)

    • Shared Row Lock (SS, Share Subordinate)
    • Exclusive Row Lock (SX, Exclusive Subordinate)
  • 表级锁(Table-Level Locks)

    • NULL (NULL)
    • Row Share (RS)
    • Row Exclusive (RX)
    • Share (S)
    • Share Row Exclusive (SRX)
    • Exclusive (X)

2. 行级锁(Row-Level Locks)

PostgreSQL

PostgreSQL 的行一级锁依赖于 MVCC(多版本并发控制),这使得读取操作无需等待锁释放,从而提高并发性。

  • FOR UPDATE:获取行排他锁,锁住被选中的行以便进行更新操作。
  • FOR SHARE:获取行共享锁,锁住被选中的行以防止其他事务的修改。
Oracle

Oracle 也使用 MVCC,并扩展了锁机制以支持更复杂的并发控制。行级锁通常伴随 DML 操作自动获取。

  • SELECT … FOR UPDATE:获取行排他锁,用于锁住被选中的行以便进行更新。
  • 锁自动获取:在普通的 DML 操作(如 INSERT、UPDATE、DELETE)中,Oracle 会自动获取适当的行级锁。

3. 表级锁(Table-Level Locks)

PostgreSQL

PostgreSQL 提供了多个层次的表级锁,适用于不同的场景:

  • LOCK TABLE … IN [锁模式]:显式获取表级锁,如 EXCLUSIVE, ACCESS EXCLUSIVE 等。
Oracle

Oracle 也支持多种表级锁模式,适用于不同的并发控制需求:

  • LOCK TABLE … IN [锁模式]:显式获取表级锁,如 SHARE, EXCLUSIVE 等。

4. 死锁检测和处理

PostgreSQL

PostgreSQL 自动检测死锁,并会中止造成死锁的某个事务以解除死锁状态。默认的死锁检测间隔为 1 秒,可以通过 deadlock_timeout 参数调整。

示例

SET deadlock_timeout = '2s';
Oracle

Oracle 也自动检测死锁,并会中止造成死锁的事务来解除死锁状态。在 Oracle 中,死锁检测是即时进行的,无需额外的配置。

5. 悲观锁与乐观锁

PostgreSQL

PostgreSQL 支持悲观锁(通过显式锁定语句)和乐观锁(通过重试机制),但悲观锁用得较多。

  • 悲观锁:通过显式的 LOCKFOR UPDATE 语句实现。
  • 乐观锁:通常通过应用层逻辑(如版本号)实现。
Oracle

Oracle 本质上更多地采用悲观锁,但也支持乐观锁。

  • 悲观锁:通过显式的 LOCK 和 DML 操作自动获取锁。
  • 乐观锁:通过 Oracle's SELECT FOR UPDATE NOWAIT/WAIT 语法和版本号机制实现。

示例对比

行级锁(Row-Level Locks)

PostgreSQL

BEGIN;-- 获取行排他锁
SELECT * FROM my_table WHERE id = 1 FOR UPDATE;-- 执行更新操作
UPDATE my_table SET column1 = 'new_value' WHERE id = 1;COMMIT;

Oracle

BEGIN;-- 获取行排他锁
SELECT * FROM my_table WHERE id = 1 FOR UPDATE;-- 执行更新操作
UPDATE my_table SET column1 = 'new_value' WHERE id = 1;COMMIT;
表级锁(Table-Level Locks)

PostgreSQL

-- 获取表排他锁
LOCK TABLE my_table IN ACCESS EXCLUSIVE MODE;

Oracle

-- 获取表排他锁
LOCK TABLE my_table IN EXCLUSIVE MODE;

6. 锁监控

PostgreSQL

查看当前锁信息:

SELECT pg_stat_activity.datname,pg_locks.pid,pg_class.relname,pg_locks.transactionid,pg_locks.granted,pg_locks.mode,pg_stat_activity.query as query_snippet,age(now(), pg_stat_activity.query_start) as age 
FROM pg_stat_activity, pg_locks LEFT OUTER JOIN pg_class 
ON (pg_locks.relation = pg_class.oid) 
WHERE pg_stat_activity.pid = pg_locks.pidAND pg_stat_activity.pid <> pg_backend_pid() 
ORDER BY query_start;
Oracle

查看当前锁信息:

SELECT s.sid, s.serial#, s.username, s.osuser, l.type, l.lmode, l.request, l.ctime, s.program, s.machine, s.status
FROM v$session s, v$lock l
WHERE s.sid = l.sid;

总结

PostgreSQL 和 Oracle 都提供了强大的锁机制来控制并发访问和确保数据的一致性。尽管它们在锁模式和参数设置上有一些不同,但总体上都具备丰富的功能来满足各种应用场景下的并发控制需求。通过合理的配置和使用,可以确保数据库系统的高效稳定运行。

相关文章:

PostgreSQL 和Oracle锁机制对比

PostgreSQL 和Oracle锁机制对比 PostgreSQL 和 Oracle 都是业界广泛使用的关系型数据库管理系统&#xff0c;它们在锁机制方面都有独到的设计来控制并发访问&#xff0c;确保数据的一致性和完整性。下面我们详细比较一下这两个数据库系统的锁机制。 1. 锁类型 PostgreSQL P…...

6月05日,每日信息差

第一、特斯拉在碳博会上展示了其全品类的可持续能源解决方案&#xff0c;包括首次在国内展出的超大型电化学商用储能系统 Megapack 和家庭储能系统 Powerwall。此外&#xff0c;特斯拉还展示了电动汽车三电系统的解构和电池回收技术产品 第二、2024 年第一季度&#xff0c;全球…...

MongoDB~俩大特点管道聚合和数据压缩(snappy)

场景 在MySQL中&#xff0c;通常会涉及多个表的一些操作&#xff0c;MongoDB也类似&#xff0c;有时需要将多个文档甚至是多个集合汇总到一起计算分析&#xff08;比如求和、取最大值&#xff09;并返回计算后的结果&#xff0c;这个过程被称为 聚合操作 。 根据官方文档介绍&…...

HTML+CSS+JS 动态登录表单

效果演示 实现了一个登录表单的背景动画效果,包括一个渐变背景、一个输入框和一个登录按钮。背景动画由多个不同大小和颜色的正方形组成,它们在页面上以不同的速度和方向移动。当用户成功登录后,标题会向上移动,表单会消失。 Code <!DOCTYPE html> <html lang=&q…...

统一返回响应

前言 我们为什么要设置统一返回响应 提高代码的可维护性&#xff1a;通过统一返回请求的格式&#xff0c;可以使代码更加清晰和易于维护&#xff0c;减少重复的代码&#xff0c;提高代码质量。 便于调试和测试&#xff1a;统一的返回格式使得在调试和测试时更为简单&#xff…...

大数据学习问题记录

问题记录 node1突然无法连接finalshell node1突然无法连接finalshell 今天我打开虚拟机和finalshell的时候&#xff0c;发现我的node1连接不上finalshell,但是node2、node3依旧可以链接&#xff0c;我在网上找了很多方法&#xff0c;但是是关于全部虚拟机连接不上finalshell&a…...

第N4周:中文文本分类

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、预备知识 中文文本分类和英文文本分类都是文本分类&#xff0c;为什么要单独拎出来个中文文本分类呢&#xff1f; 在自然语言处理&#xff08;NLP&#x…...

【kubernetes】探索k8s集群的pod控制器详解(Deployment、StatefulSet、DaemonSet、Job、CronJob)

目录 一、Pod控制器及其功用 二、pod控制器有多种类型 2.1ReplicaSet 2.1.1ReplicaSet主要三个组件组成 2.2Deployment 2.3DaemonSet 2.4StatefulSet 2.5Job 2.6Cronjob 三、Pod与控制器之间的关系 3.1Deployment 3.2SatefulSet 3.2.1StatefulSet三个组件 3.2.2为…...

直接插入排序

#include <stdio.h>void insert_sort(int arr[], int n) {int i;int j;int tmp;for (i 1; i < n; i){tmp arr[i];j i - 1;// 将要插入的元素与数组中的元素比较&#xff08;从后向前比&#xff09; while (j > 0 && arr[j] > tmp){arr[j 1] arr[…...

esp32s3 nvs 存储过程中使用malloc和free函数的一点困惑

我的项目中&#xff0c;大量使用了malloc()和free()函数&#xff0c;在使用nvs存储之前没有出现问题。 esp32厂家nvs的blob存储的例程中&#xff0c;有使用malloc()和free()&#xff0c;我参照例程写了自己的blob存储函数f&#xff0c;一开始是可以正常使用的&#xff0c;后来…...

除visio以外的几款好用流程图绘制工具

流程图绘制软件在嵌入式软件开发中扮演着重要的角色&#xff0c;它们能够帮助用户清晰、直观地展示工作流程。以下是几款流行的流程图绘制软件及其特点的详细报告&#xff1a; 思维导图MindMaster MindMaster作为一款专业的思维导图软件&#xff0c;不仅具备强大的思维导图制作…...

CentOS 7 64位 常用命令

一、系统管理命令 systemctl start firewalld.service&#xff1a;启动防火墙服务 systemctl stop firewalld.service&#xff1a;停止防火墙服务 systemctl enable firewalld.service&#xff1a;设置防火墙服务开机自启 systemctl disable firewalld.service&#xff1a;禁止…...

ChatGPT-4o抢先体验

速度很快&#xff0c;结果很智能&#xff0c;支持多模态输入输出&#xff0c;感兴趣联系作者。 windows/linux/mac 客户端下载参考&#xff1a;https://github.com/lencx/Noi...

STM32实验之USART串口发送+接受数据(二进制/HEX/文本)

涉及三个实验&#xff1a; 1.USART串口发送和接收数据 我们使用的是将串口封装成为一个Serial.c模块.其中包含了 void Serial_Init(void);//串口初始化 void Serial_SendByte(uint8_t Byte);//串口发送一个字节 void Serial_SendArray(uint8_t *Array,uint16_t Length);//…...

网关(Gateway)- 内置过滤器工厂

官方文档&#xff1a;Spring Cloud Gateway 内置过滤器工厂 AddRequestHeaderGatewayFilterFactory 为请求添加Header Header的名称及值 配置说明 server:port: 8088 spring:application:name: api-gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8847username: nacos…...

电风扇如何实现跌倒断电保护功能

电风扇作为日常生活中常用的家电产品&#xff0c;为了提升安全性能&#xff0c;在设计上通常会考虑加入跌倒断电保护功能。其中&#xff0c;光电倾倒开关是实现跌倒断电保护功能的关键组件之一。 光电倾倒开关内置红外发光二极管和光敏接收器&#xff0c;其工作原理非常巧妙。…...

编译原理总结

编译器构成 1. 前端分析部分 1.1 词法分析 确定词性&#xff0c;输出为token序列 1.2 语法分析 识别短语 1.3 语义分析 分析短语在句子中的成分 IR中间代码生成 2. 机器无关代码优化 3. 后端综合部分 目标代码生成 机器相关代码优化 4. 其他 全局信息表 异常输出...

JavaScript:从基础到进阶的全面介绍

JavaScript&#xff1a;从基础到进阶的全面介绍 JavaScript&#xff08;简称JS&#xff09;是一种广泛用于Web开发的编程语言。它是一种轻量级的、解释型或即时编译的语言&#xff0c;具有函数优先的特点。JS最初是为了实现网页的动态效果而设计的&#xff0c;如今已发展成为前…...

linux指令-sed

sed 是一个流编辑器&#xff0c;用于对输入流&#xff08;或文件&#xff09;进行基本的文本转换。以下是 sed 命令的详细输出说明文档&#xff1a; 1. 基本语法 sed [OPTIONS]... [SCRIPT] [INPUTFILE...] OPTIONS&#xff1a;可选的命令行选项&#xff0c;如 -i 用于直接修…...

Docker部署青龙面板

青龙面板 文章目录 青龙面板介绍资源列表基础环境一、安装Docker二、安装Docker-Compose三、安装青龙面板3.1、拉取青龙&#xff08;whyour/qinglong&#xff09;镜像3.2、编写docker-compose文件3.3、检查语法启动容器 四、访问青龙面板五、映射本地部署的青龙面板至公网5.1、…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...