PostgreSQL11 | 事务处理与并发控制

news2024/9/20 9:30:31

PostgreSQL11 | 事务处理与并发控制

本文章代码已在pgsql11.22版本上运行且通过,展示页由pgAdmin8.4版本提供,本文章第一次采用md文档,效果比csdn官方富文本编辑器好用,以后的文章都将采用md文档

事务管理简介

事物是pgsql中的基本工作单元,是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是最低的工作单位

含义

事务必须要有明确的开始和结束点,pgsql中的每一条数据操作语句(例如select)都是隐式事务的一部分,即使只有一条数据操作语句,系统也会把这条语句当作一个事务,要么执行所有语句,要么什么都不执行

在pgsql中,由事务管理器负责管理事务运行的模块,结构如下:

事务管理器
锁管理器
进程管理
日志管理器
CLOG管理器
XLOG管理器
  • 事务管理器是事务系统的中枢,通过接受的信息处理下一步的事务操作。
  • 锁管理器主要提供在事务的写阶段并发控制所需要的各种锁,从而保证事务的各种隔离级别
  • 日志管理器主要是记录事务执行的状态和数据的变化过程

写到日志中的事务一般有两种

写入
写入
针对数据的操作
日志
针对任务的操作

针对数据的操作:插入、修改和删除,这些操作的对象是大量的数据

针对任务的操作:例如创建索引

当取消这些事务操作时,系统会自动执行这些操作的反操作,以保证系统的一致性,系统会自动生成一个检查点机制,这个检查点周期性的检查事务日志,如果在事务日志中,事务全部完成,那么检查点事务日志中的事务才会提交给数据库,并在事务日志中做一个检查点提交标识;若事务没有全部完成,则不会将事务日志中的事务提交数据库,并在事务日志中做一个检查点未提交的标识。

事务的恢复及检查点保证了系统的完整和可恢复

事务的属性

事务作为单个逻辑工作单元执行的一系列操作,一个逻辑单元必须有四个属性

  • 原子性:事务必须是原子工作单元
  • 一致性:事务完成时,必须使所有的数据都保持一致状态
  • 隔离性:由并发事务所做的修改必须与任何其他并发事务所做的修改隔离
  • 持久性:事务完成后,它对于系统的影响是永久性的

事务块管理的常用语句

在pgsql中,一个事务是通过把sql命令用BEGINCOMMIT命令包围实现的,语法如下:

BEGIN;
sql语句1.....
COMMIT;

事务块是指包围在BEGINCOMMIT之间的语句,同时注意两个关键词后一定要写;符号

常用事务块管理语句的含义如下:

  1. START TRANSACTION此命令表示一个新的事物块
  2. BEGIN表示初始化一个事务块,此后的语句都将在一个事务块中执行,直到出现COMMITROLLBACK,此命令与START TRANSACTION等价
  3. COMMIT提交事务
  4. ROLLBACK事务失败时执行回滚操作
  5. SET TRANSACTION设置当前事务的特性,对后面的事务没有影响

事务的应用案例

1.先建表people,如果已经有同样的表请先清空表
create table people
(
	id INT,
	name VARCHAR(40),
	age INT,
	info VARCHAR(50)
);
2.向people表中插入两名学生记录
insert into people values (1001,'斯大林',23,'18781218');
insert into people values (1002,'丘吉尔',25,'18741130');
3.查表people

在这里插入图片描述

4.接下来试着用事务块来进行插入操作

这里注意,我们的事务块到最后使用了回滚操作撤销了所有的对数据的操作

begin;
insert into people values (1003,'切格瓦拉',22,'19280614');
insert into people values (1004,'戴高乐',29,'18901122');
insert into people values (1004,'罗斯福',31,'18820130');
rollback transaction;
commit;
5.再次查表people

在这里插入图片描述

表中没有变化是因为事务撤销了对表的插入操作

PostgreSQL的并发控制

pgsql支持多用户共享同一数据库,但是当多个用户同时对同一数据库进行修改的时候会产生并发问题,所以并发控制的目标就是保证可用且高效且维护数据的完整性

并发导致的问题

数据库中的数据并发操作经常发生,而对数据的并发操作会带来脏读、幻读、不可重复读取等问题

  • 脏读:例如,当事务1读取的数据是事务2尚未完成,在过程中所临时产生的,后续又被事务2回滚掉了,而这一数据又被事务1读到了,那么所读取到的数据就是“错误”的,得到的数据是不真实的,数据本身仍未完成操作就被读,这个读取就是脏读
  • 幻读:例如,当事务1进行更新或删除时,事务2同时间对事务1所操作的部分进行了新增,则对于事务1来说,对数据的更新或删除不完全,因为新增的数据不在事务1操作的选中范围内,当事务1再次查看事务执行的结果时会查到事务2新增的数据,对于事物1产生了幻读
  • 不可重复性读取:当事务1在连续两次读取同一条记录时,事务2同步进行了数据的修改,对于事务1的两次查询结果是不相同的

pgsql利用多版本控制(MVCC)来维护数据的一致性,当检索数据时,每个事务看到的都是一小段时间之前的数据快照,而不是当前数据库真实的状态,这样对每个数据库会话进行隔离,就可以避免一个事务因为其他事务的操作而导致不一样的数据

四个事务隔离级别

在pgsql中,定义了4个事务隔离级别

  • 读未提交
  • 读已提交
  • 可重复读
  • 可串行读

在pgsql中,可以请求四种可能的事务隔离级别中的一种,但在其内部实际上只有两种独立的隔离级别:读已提交可串行读

读已提交是默认的隔离级别,容易出现幻读不可重复性读取问题,当两个事务对同一条数据更新时,第一个事务运行时,第二个事务需要等第一个事务提交或回滚才能进行

可串行化是最严格的事务隔离,不会出现上述三种问题,当两个事务对同一条数据更新时,串行化事务会等待第一个事务的提交或回滚,当第一事务提交了则回滚串行化事务,从头开始整个事务,如果第一个事务回滚了则忽略其影响,保证了串行化事务执行的时候是基于第一个事务完成后的实际数据进行操作

锁机制

MVCC并不能解决所有的并发控制情况,所以必须引入锁机制来保证事务的并发

锁的类型

  • SpinLock(自旋锁):使用互斥信号,与操作系统和硬件环境联系比较密切,封锁时间短,没有等待队列和死锁检测机制,事务结束后不能自动释放

  • LWLock(轻量级锁):主要提供对共享存储器的数据结构的互斥访问,特点主要是有等待队列和无死锁检测,事务结束后自动释放

    LWLock锁分为排他模式和共享模式,排他模式用于增删改,共享模式用于查

  • RegularLock(常规锁):一般数据库事务管理中所指的锁,有等待队列、死锁检测和自动释放的特点

    常规锁支持的模式有8种,按排他级别从低到高分别为:

    1. ACCESS SHARE(访问共享锁):查询命令将会在查询的表上获取访问共享锁
    2. ROW SHARE(行共享锁):使用SELECT FOR UPDATE(锁定查询结果中的每一行,而不是整个表)和SELECT FOR SHARE(对查询结果中的每一行施加共享锁。这意味着其他事务仍然可以读取这些行,但不能修改或删除它们,直到当前事务提交或回滚)命令时会获得行共享锁
    3. ROW EXCLUSIVE(行排他锁):使用UPDATEDELETEINSERT命令会在目标表上获得行排他锁
    4. SHARE UPDATE EXCLUSIVE(共享更新排他锁):使用VACUUM(当表中的行被更新或删除时,PostgreSQL不会立即从物理存储中移除这些行,而是将它们标记为不再需要(即死元组)。VACUUM命令会扫描表并移除这些死元组,使空间能够被重新利用)、ANALYZE(用于收集数据库中表和索引的统计信息,如列的数据分布、唯一值数量、空值数量等)、CREATE INDEX CONCURRENTLY(允许你在不锁定表的情况下创建索引。这意味着在创建索引的过程中,其他用户仍然可以对表进行读取和写入操作,而不会受到创建索引操作的影响)语句时使用共享排他锁
    5. SHARE(共享锁):使用CREATE INDEX语句请求时使用共享锁
    6. SHARE ROW EXCLUSIVE(共享行排他锁):和排他锁类似,只是允许共享
    7. EXCLUSIVE(排他锁):阻塞行共享和SELECT FOR UPDATE时使用排他锁
    8. ACCESS EXCLUSIVE(访问排他锁):如果没有声明指定模式,此模式为默认模式

死锁

多用户环境下,死锁的发生是由两个事务都锁定了不同的资源,又同时都在申请对方锁定的资源,互不释放,互相申请,且不更改条件,持续申请进而处于一种永久等待的状态

死锁的四个必要条件
  • 请求与保持条件
  • 非剥夺条件
  • 循环等待条件
  • 互斥条件
减少死锁的策略
  1. 在所有事务中以相同的次序使用资源
  2. 使事务尽可能简短并在同一批处理中
  3. 为死锁超时参数设置一个合理的范围,一般为3~30分钟,若超时则放弃本次操作,避免进程挂起
  4. 避免在事务内和用户进行交互,减少资源的锁定时间
  5. 使用较低的隔离级别,相比较高的隔离级别能够有效减少持有的共享锁的时间,减少锁之间的竞争

锁的语法

在pgsql中锁定一个表,语法如下:

LOCK [TABLE] name[,name2,..][IN lockmode MODE][NOWAIT]

作者的话(Alvin):

本文根据原书《PostgreSql11 从入门到精通》(清华大学出版社)第12章总结整理,为提问与解答可以帮助更多人,本博客模拟GitHub的issue方案,所以私信已关,有问题请在评论区直接指正与提问,允许转发、复制或引用本文章,必须遵守开源法则注释来源与作者,感谢您的阅读

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2065382.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自己动手写CPU_step2_构建SOPC

ROM实现指令寄存器 上一篇中实现的五级流水线需要一个输入,这个输入是指令数据,而指令数据是通过取指阶段的PC控制的,PC会一直循环的取指令。 指令寄存器实现: //指令寄存器 module inst_rom(input clk,inp…

【C++ Primer Plus习题】2.1

问题: 解答: #include <iostream> using namespace std;int main() {cout << "在下国林!" << endl;cout << "家住天府之国!" << endl;return 0; }运行结果: 考查点: 预处理头文件命名空间main函数c的标准输出和换行字符…

机器学习/数据分析--通俗语言带你入门K-邻近算法(结合案例)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 机器学习是深度学习和数据分析的基础&#xff0c;接下来将更新常见的机器学习算法注意&#xff1a;在打数学建模比赛中&#xff0c;机器学习用的也很多&a…

初识Linux · yum和vim

目录 前言&#xff1a; 1 yum 1.1 yum是什么&#xff1f; 1.2 Centos的生态和yum的本地配置 1.3 yum的相关操作 2 vim 前言&#xff1a; 我们学习Linux的时候&#xff0c;是有编程语言的基础的&#xff0c;那么呢&#xff0c;我们学习Linux的时候最迫切的就是希望能打印…

Flat Ads:全球金融应用现状与发展趋势深度解析

随着全球数字化进程的加速,金融科技(FinTech)应用正逐渐成为现代生活不可或缺的一部分。从移动银行到数字支付,再到智能理财工具,金融应用正在重新定义传统金融服务的边界,并推动行业的深刻变革。 本篇文章 Flat Ads 将从全球视角出发,深入剖析当前金融应用市场的现状,探讨未来…

开关电源测试系统方案:系统结构功能、特点、测试项目

为了应对开关电源测试中的复杂挑战&#xff0c;我们推出了NSAT-8000系列开关电源ate测试系统&#xff0c;它以其全面的功能和灵活性&#xff0c;适应了电源产品测试场景&#xff0c;解决了测试难题。 开关电源测试系统 NSAT-8000系列之开关电源测试系统适用于AC/DC和DC/DC开关电…

苹果macbook电脑怎么玩《黑神话:悟空》游戏教程来了

火爆全网《黑神话&#xff1a;悟空》是一款基于中国神话故事《西游记》改编的动作角色扮演游戏&#xff0c;它在PC平台上的系统要求已经公布&#xff0c;但目前官方尚未发布Mac版本。不过&#xff0c;Mac用户可以通过使用系统兼容工具如CrossOver来尝试在Mac上运行这款游戏。Cr…

《黑神话:悟空》游戏攻略:第一回合打法教程!

《黑神话&#xff1a;悟空》是一款以西游记为背景的动作角色扮演游戏&#xff0c;玩家在游戏中将面对各式各样的强大敌人和BOSS。在游戏的第一回合中&#xff0c;你将遇到牯护院、灵虚子、幽魂等多个BOSS。以下是详细的BOSS打法攻略&#xff0c;帮助你在战斗中游刃有余。你可以…

Ubuntu22安装MySQL8,并关闭大小写

最近因为设置MySQL不区分大小写踩了很多坑&#xff0c;把解决过程记录下来。 首先我这个是阿里云全新服务器&#xff0c;操作系统&#xff1a;Ubuntu 22.04 64位 连接到服务器后&#xff1a; 1 安装MySQL 1.1 更新软件包 以下命令皆已单独放至代码块内&#xff0c;直接复制…

服务器配置miniconda环境

目录 1. 查看服务器的操作系统2. 查看服务器的cuda版本3. 配置开发环境3.1 安装miniconda3环境3.2 创建虚拟环境3.3 在虚拟环境中安装pytorch3.4 在虚拟环境中安装库 1. 查看服务器的操作系统 执行代码&#xff1a; uname -a发现是Ubuntu 22.04 2. 查看服务器的cuda版本 执…

鸿蒙OS应用开发例题

单选题 第24/60题 自动跳下一题0 在编译构建HAP时&#xff0c;会从HAP模块及依赖的模块中收集资源文件&#xff0c;如果不同模块下的资源文件出现重名冲突 时&#xff0c;会按照优先级进行覆盖&#xff0c;现在有一个HAP依赖了两个HAR,依赖配置如下所示: // oh-package. j…

柔性织物处理 | 山大宋锐老师 | 最新演讲

笔者是清华在读研究生&#xff0c;主要关注人形机器人、具身智能。将持续分享行业前沿动态、学者观点整理、论文阅读笔记、知识学习路线等。欢迎交流 最近听了宋老师的演讲&#xff0c;以下是学习整理。部分图截自直播&#xff0c;若模糊望见谅 演讲信息&#xff1a; 【会议】…

郁李:花语与植物特征的魅力探寻

一、花语的奥秘 郁李的花语丰富多样&#xff0c;其中 “忠实” 代表着坚定不移的忠诚和信任&#xff0c;寓意着一份真挚而深厚的情感&#xff0c;无论外界如何变化&#xff0c;都能保持初心不变。“困难” 这一花语似乎不太讨喜&#xff0c;它可能象征着人生道路上难免会遭遇的…

iOS 通知

iOS 通知分为本地推送和远程推送两类 一. 本地推送使用流程 1. 注册通知 //请求通知权限 UNUserNotificationCenter *center [UNUserNotificationCenter currentNotificationCenter];[center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizati…

Java学习_18_Stream流

文章目录 前言一、不可变集合二、Stream流思想第一步&#xff1a;得到Stream流第二步&#xff1a;Stream流的中间方法Stream流的终结方法 总结 前言 博客仅记录个人学习进度和一些查缺补漏。 学习内容&#xff1a;BV17F411T7Ao 一、不可变集合 不可变集合就是长度和内容都不可…

HTML+CSS浮动和清除浮动的效果及其应用场景举例

一、清除浮动的效果 解释 .container&#xff1a;用于展示浮动和清除浮动效果的容器&#xff0c;具有边框和背景色以便于区分。 .float-box&#xff1a;浮动元素&#xff0c;用不同的背景色标识。 .clearfix&#xff1a;使用伪元素清除浮动的类&#xff0c;应用于第二个容器。 …

【chips】个人笔记系列-SystemVerilog

Title&#xff1a;System Verilog 学习 背景与发展 什么是SV 啥是SystemVerilog&#xff1f; 就是用来专门写验证和测试的 Verilog 升级版——在verilog的基础上加了些C的思想、语法、模块。 为啥要搞出一个SystemVerilog&#xff1f; 设计IC (integrated circuit)时用的是 …

02_TensorFlow2 Eager Execution:让AI编程从‘慢条斯理’变‘急不可耐’的神奇魔法!

1. Eager execution 的特性 即刻执行&#xff08;Eager execution&#xff09;是TensorFlow2.0的新特性&#xff0c;如同python解释器一样&#xff0c;执行即可获得计算结果&#xff0c;不需要手动建立图结构和会话&#xff0c;与python的兼容性更强, 为快速搭建和测试算法模型…

C语言 之 内存函数 memcpy、memmove函数的使用和模拟实现 memset、memcmp函数的使用

文章目录 1.memcpy函数的使用和模拟实现例子&#xff1a;模拟实现: 2.memmove函数的使用和模拟实现例子&#xff1a;模拟实现&#xff1a; 3.memset函数的使用**例子&#xff1a;** 3.memcmp函数的使用例子&#xff1a; 首先 我们要明确下面这些函数之所以被称作内存函数&#…

130-横向移动PTH哈希PTT票据PTK密匙Kerberos

pass the hash &#xff08;哈希传递攻击&#xff0c;简称pth&#xff09;利用lm&#xff08;老版本哈希&#xff09;或ntlm&#xff08;新版本&#xff09;的值进行的渗透测试 pass the ticket &#xff08;票据传递攻击&#xff0c;简称ptt&#xff09;利用的票据凭证TGT进行…