7.事务、并发和锁
事务、并发和锁什么是 ACID原子性Atomicity一致性Consistency隔离性Isolation持久性DurabilityDDL 事务在 PostgreSQL 中与其他数据库最大的不同是大多数 DDL 也是可以包含在一个事务中的而且也是可以回滚的。适合场景PostgreSQL 作为 Sharding 分布式数据系统的底层数据库。Sharding 中常常需要在多个节点中建相同的表此时可以考虑把建表语句放在同一个事务中这样就可以在各个节点上先启动一个事务然后再执行建表语句保证整个集群的一致性。事务的使用方法在 psql 的默认配置下自动提交功能AUTOCOMMIT是打开的。可以通过设置 psql 中的内置变量AUTOCOMMIT来关闭自动提交功能\setAUTOCOMMIToff;BEGIN;SAVEPOINT保存点PostgreSQL 支持保存点SAVEPOINT的功能在一个大的事务中可以把操作过程分成几个部分第一个部分执行成功后可以建一个保存点若后面的部分执行失败则回滚到此保存点而不必回滚整个事务。案例BEGIN;INSERTINTOtesttab01VALUES(1);INSERTINTOtesttab01VALUES(2);SAVEPOINTmy_savepoint01;INSERTINTOtesttab02VALUES(1);INSERTINTOtesttab02VALUES(1);-- 假设这里违反唯一约束报错如果发生错误只需回滚到上一个保存点ROLLBACKTOmy_savepoint01;事务隔离级别数据库的事务隔离级别有以下 4 种READ UNCOMMITTED读未提交READ COMMITTED读已提交REPEATABLE READ可重复读SERIALIZABLE串行化对于并发事务我们不希望发生不一致的情况这类情况的级别从高到低排序如下脏读不可重复读幻读PostgreSQL 中只支持三种隔离级别读已提交可重复读串行化需要说明在 PostgreSQL 的一个事务中不可能读到其他事务中未提交的数据。在选择可重复读级别的时候实际上仍是可串行化所以实际的隔离级别可能比你选择的更加严格。两阶段提交多台数据库之间的原子性就需要通过两阶段提交来实现两阶段提交是实现分布式事务的关键。PostgreSQL 数据库支持两阶段提交协议。两阶段提交协议的步骤应用程序调用事务协调器通知准备提交事务PostgreSQL 中一般是调用PREPARE TRANSACTION命令接收到PREPARE TRANSACTION命令保证将自己置于准备提交中的状态事务协调器接收所有数据库的响应如果任何一个数据库在第一阶段返回失败则事务协调器将会发一个回滚命令ROLLBACK PREPARED给各台数据库PostgreSQL 持久化事务案例前提max_prepared_transactions必须设置为一个大于 0 的数字。-- 设置 max_prepared_transactions需在 postgresql.conf 中配置SETmax_prepared_transactions10;-- 如果配置文件中未设置此处会报错-- 创建表CREATETABLEtesttab01(idINTPRIMARYKEY);-- 启动事务BEGIN;INSERTINTOtesttab01VALUES(1);-- 准备事务PREPARETRANSACTIONglobal_trans_1;-- 全局事务 ID-- 模拟数据库重启-- pg_ctl stop -D $PGDATA-- pg_ctl start -D $PGDATA-- 连接数据库提交两阶段事务COMMITPREPAREDglobal_trans_1;-- 查询数据SELECT*FROMtesttab01;表级锁表级锁只有SHARE和EXCLUSIVE两种表级锁共有八种模式其存在于 PostgreSQL 的共享内存中可以通过pg_locks系统视图查询。锁模式解释ACCESS SHARESELECT 命令在被引用的表上会获得一个这种模式的锁。通常任何只读取表而不修改它的查询都将获取这种模式。ROW SHARESELECT FOR UPDATE 和 SELECT FOR SHARE 命令在目标表上会获得一个这种模式的锁。ROW EXCLUSIVEUPDATE、DELETE 和 INSERT 命令在目标表上会获得一个这种模式的锁。SHARE UPDATE EXCLUSIVEALTER INDEX 和 ALTER TABLE 命令的变体会获得。这种模式保护一个表不受并发模式改变的影响。SHARECREATE INDEX不带 CONCURRENTLY命令会获得。这种模式保护一个表不受并发数据改变的影响。SHARE ROW EXCLUSIVECREATE TRIGGER 命令和某些形式的 ALTER TABLE 命令会获得。EXCLUSIVEREFRESH MATERIALIZED VIEW CONCURRENTLY 命令会获得。表锁特点锁粒度非常大。通过类似于 MySQL 意向锁的方式PostgreSQL 中也是这样实现的如ROW SHARE、ROW EXCLUSIVE这两个锁。行级锁行级锁模式比较简单只有两种共享锁排它锁在 PostgreSQL 中由于有多版本的实现所以实际读取行数据时并不会在行上执行任何锁。表级锁命令 LOCK TABLELOCK[TABLE][ONLY]name[,...][INlockmodeMODE][NOWAIT];NOWAIT表示不等待锁如果无法立即获取锁则报错。行级锁命令SELECT...FOR{UPDATE|SHARE}[OFtable_name[,...]][NOWAIT][...];NOWAIT关键字与在LOCK TABLE中相同加了NOWAIT后如果无法获得锁则直接报错而不会一直等待。锁的查看pg_locks可以查询到当前锁的信息比如哪个事务被哪个事务阻塞了若执行一条 SQL 语句时阻塞住了需要查询为什么阻塞是谁阻塞住的。名字类型引用描述locktypetext可锁定对象的类型relation, extend, page, tuple, transactionid, object, userlockdatabaseoidpg_database.oid对象所在的数据库的 OIDrelationoidpg_class.oid关系的 OIDpageinteger关系内部的页面编号tuplesmallint页面里面的元组编号transactionidxid事务的 IDclassidoidpg_class.oid包含该对象的系统表的 OIDobjidoid对象在其系统表内的 OIDobjsubidsmallint对于表的一个字段这是字段编号transactionxid持有此锁或者在等待此锁的事务的 IDpidinteger持有或者等待这个锁的服务器进程的进程 IDmodetext这个进程持有的或者是期望的锁模式grantedboolean如果持有锁为真如果等待锁为假表锁查询案例Session 1CREATETABLEtesttab02(idINTPRIMARYKEY);INSERTINTOtesttab02VALUES(1);BEGIN;LOCKTABLEtesttab02;查询锁SELECTlocktype,relation::regclassASrel,virtualxidASvxid,transactionidASxid,virtualtransactionASvxid2,pid,mode,grantedFROMpg_locks;结果解释其中一行显示的是事务在自己的virtualxid上加的ExclusiveLock锁这是必定会加上的。另一行才是我们实际在表上加的锁AccessExclusiveLock。Session 2BEGIN;LOCKTABLEtesttab02;-- 将被阻塞查询锁SELECTlocktype,relation::regclassASrel,virtualxidASvxid,transactionidASxid,virtualtransactionASvxid2,pid,mode,grantedFROMpg_locks;行锁查询案例Session 1SELECT*FROMtesttab02WHEREid1;BEGIN;SELECT*FROMtesttab02WHEREid1FORUPDATE;第三个窗口查询锁SELECTlocktype,relation::regclassASrel,virtualxidASvxid,transactionidASxid,virtualtransactionASvxid2,pid,mode,grantedFROMpg_locks;问题 1为什么没有发现行锁答案实际上pg_locks并不能显示出每个行锁的信息原因也很简单行锁信息并不会记录到共享内存中。问题 2在pg_locks中没有行锁信息如何知道一个进程被另一个进程的行锁阻塞了呢Session 2BEGIN;SELECT*FROMtesttab02WHEREid1FORUPDATE;-- 将被阻塞想查看哪个进程被阻塞住了只需要查看granted字段值为False的 PID。SELECTpg_backend_pid();-- 查看当前会话的 PID通过pg_locks中granted false的记录可以找到被阻塞的进程。

相关新闻

【复试真题】保护一志愿!但很卷

【复试真题】保护一志愿!但很卷

26复试课程已上线~另外还有线下复试集训营。1V1的简历修改自我介绍修改模拟面试1V1直系学长的复试专属讲解等内容。 祝大家复试顺利,成功上岸! 写在前面 为了帮助大家顺利通过最后一关,今天开始我将每天更新一套复试真题!复试真…

2026/7/10 5:31:54 阅读更多 →
SGMICRO圣邦微 SGM3157YC6/TR SC70-6 模拟开关/多路复用器

SGMICRO圣邦微 SGM3157YC6/TR SC70-6 模拟开关/多路复用器

特性工作电压:1.8V至5.5V导通电阻:5.0V时典型值为4.5Ω快速开关时间:导通时间20ns,关断时间15ns高带宽:300MHz高关断隔离度:10MHz时为 - 51dB轨到轨操作TTL/CMOS兼容先断后通切换扩展工业温度范围&#xff…

2026/7/7 23:28:50 阅读更多 →
企业级spring boot医院挂号就诊系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】

企业级spring boot医院挂号就诊系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】

摘要 随着信息技术的快速发展,医疗行业的信息化管理需求日益增长。传统医院挂号就诊系统存在效率低下、资源分配不均、患者体验差等问题,亟需通过现代化技术手段进行优化。本系统基于企业级开发框架,旨在构建一个高效、稳定、易扩展的医院挂…

2026/7/10 19:34:15 阅读更多 →

最新新闻

5种核心架构图绘制实战:从业务到部署的3层抽象与4+1视图映射

5种核心架构图绘制实战:从业务到部署的3层抽象与4+1视图映射

5种核心架构图绘制实战:从业务到部署的3层抽象与41视图映射架构图是软件工程中的"设计蓝图",它如同建筑师的施工图纸,将复杂的系统结构可视化。对于中高级架构师而言,掌握不同抽象层次的架构图绘制技巧,是驾…

2026/7/11 5:06:18 阅读更多 →
HackRF-One 1MHz-6GHz 性能解析:8-bit 采样与 15 dBm 发射功率实测指南

HackRF-One 1MHz-6GHz 性能解析:8-bit 采样与 15 dBm 发射功率实测指南

HackRF-One 1MHz-6GHz 性能解析:8-bit 采样与 15 dBm 发射功率实测指南在软件定义无线电(SDR)领域,HackRF-One 凭借其 1MHz 至 6GHz 的超宽频段覆盖和开源特性,成为开发者手中的利器。本文将深入解析其硬件性能边界&am…

2026/7/11 5:02:17 阅读更多 →
Codex CLI 生产级使用手册:安装配置、安全沙箱与高手技巧

Codex CLI 生产级使用手册:安装配置、安全沙箱与高手技巧

1. 项目概述:Codex CLI 不是终端里的 ChatGPT,而是一个能坐你工位旁写代码的“AI 同事”Codex CLI 这个名字最近在开发者圈子里频繁刷屏,但很多人一上手就懵了:它和 ChatGPT 有什么区别?装完为啥连个文件都改不了&…

2026/7/11 5:02:17 阅读更多 →
R语言贝叶斯核机回归用于估算多污染混合物的健康影响

R语言贝叶斯核机回归用于估算多污染混合物的健康影响

多污染物暴露的健康影响在环境流行病学至关重要。混合物成分可能与健康存在复杂的非线性和非加性关系,有时候单用线性来解释可能会捕捉不到阳性结果,或者出现错误。 核机回归(KMR),也称为高斯过程回归,是机…

2026/7/11 5:00:17 阅读更多 →
OpenAI DevDay 2026参会指南:API更新、技术交流与开发者价值

OpenAI DevDay 2026参会指南:API更新、技术交流与开发者价值

最近在AI开发者圈子里,OpenAI DevDay 2026的报名截止日期(7月10日)即将到来,很多技术团队都在讨论如何把握这次与OpenAI团队直接交流的机会。作为开发者,参与这样的技术盛会不仅能了解最新的API更新和工具链&#xff0…

2026/7/11 4:58:17 阅读更多 →
英雄联盟玩家的智能助手:League Akari 全功能使用手册

英雄联盟玩家的智能助手:League Akari 全功能使用手册

英雄联盟玩家的智能助手:League Akari 全功能使用手册 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否厌倦了在英雄联盟中手…

2026/7/11 4:58:17 阅读更多 →

日新闻

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南 【免费下载链接】comfyui_controlnet_aux ComfyUIs ControlNet Auxiliary Preprocessors 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux 想要让AI图像生成真正听从你的指挥吗&…

2026/7/11 0:02:12 阅读更多 →
PIC18F45K42驱动EPT-14A4005P压电蜂鸣器方案详解

PIC18F45K42驱动EPT-14A4005P压电蜂鸣器方案详解

1. 项目背景与核心需求 在工业控制、安防系统和智能家居等领域,可靠的声音警报系统是不可或缺的基础组件。传统蜂鸣器存在音量不足、音质模糊等问题,而基于压电陶瓷技术的EPT-14A4005P蜂鸣器配合PIC18F45K42微控制器,能够构建一套适应性强、音…

2026/7/11 0:04:12 阅读更多 →
大模型推理中的算子融合优化:LayerNorm + Attention 的 CUDA Kernel 手写与验证

大模型推理中的算子融合优化:LayerNorm + Attention 的 CUDA Kernel 手写与验证

大模型推理中的算子融合优化:LayerNorm Attention 的 CUDA Kernel 手写与验证 一、GPU 利用率 30%:分开的算子吃掉所有带宽 推理服务的 GPU 利用率监测显示一个反直觉的现象:计算核心(SM)利用率不到 30%,但…

2026/7/11 0:04:12 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/10 19:03:29 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/9 13:46:46 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/9 21:41:05 阅读更多 →

月新闻