PostgreSQL11 | 事务处理与并发控制

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.mzph.cn/pingmian/52364.shtml

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

相关文章

三种相机模型总结(针孔、鱼眼、全景)

相机标定 文章目录 相机标定前言 前言 我们最常见的投影模型Perspective Projection Model描述的就是针孔相机的成像原理。从上面的图根据相似三角形可以得出 参考链接 https://zhuanlan.zhihu.com/p/540969207 相机标定之张正友标定法数学原理详解(含python源码&a…

上线eleme项目

(一)搭建主从从数据库 主服务器master 首先下载mysql57安装包,然后解压 复制改目录到/usr/local底下并且改个名字 cp -r mysql-5.7.44-linux-glibc2.12-x86_64 /usr/local/mysql 删掉/etc/my.cnf 这个会影响mysql57的启动 rm -rf /etc…

解读vue3源码-响应式篇3 effect副作用函数

提示:看到我 请让我滚去学习 文章目录 前言effect问题拓展分支切换与 cleanup嵌套的 effect 与 effect 栈解决在副作用函数中同时读取和操作同一属性时无限循环 effect函数实现computed-api 实现图解在这里插入图片描述 总结 前言 什么是副作用函数? 在…

SCYC 56901传感器SCYC 56901模块面价

SCYC 56901传感器SCYC 56901模块面价 SCYC 56901传感器SCYC 56901模块面价 SCYC 56901传感器SCYC 56901模块面价 SCYC 56901传感器SCYC 56901模块引脚线 SCYC 56901传感器SCYC 56901模块说明书 SCYC 56901传感器SCYC 56901模块电路图 SCYC 56901温度传感器是早开发&#…

iPhone 手机使用技巧:iPhone 数据恢复软件

无论是由于意外删除、系统崩溃还是软件更新,丢失 iPhone 上的数据都是一场噩梦。从珍贵的照片到重要的工作文件,这种损失可能会让人感到毁灭性。值得庆幸的是,几个 iPhone 数据恢复软件选项可以帮助您找回丢失的文件。这些工具提供不同的功能…

神经网络——非线性激活

1 非线性激活 1.1 几种常见的非线性激活: ReLU (Rectified Linear Unit)线性整流函数 Sigmoid 1.2代码实战: 1.2.1 ReLU import torch from torch import nn from torch.nn import ReLUinputtorch.tensor([[1,-0.5],[-1,3]])inputtorch.reshape(…

刷题DAY18

排序 题目:输入10个大小不同的整数,将它们从小到大排序后输出,并给出现每个元素在原来序列中的位置 输入:输入数据有一行,包含10个整数,用空格分开 输出:输出数据有两行,第一行为…

【计算机网络】名词解释--网络专有名词详解

在网络通信中,有许多专业术语和概念,它们共同构成了网络通信的基础。以下是一些常见的网络术语及其定义和相互之间的关系: 一、网络基础 1.1 电路交换:电路交换是一种在数据传输前建立专用通信路径的通信方式。在通信开始前&…

HTML+CSS+JavaScript制作动态七夕表白网页(含音乐+自定义文字)

源码介绍 这篇博客就享下前端代码如何实现HTMLCSSJavaScript制作七夕表白网页(含音乐自定义文字)。记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面,重定向这个界面 源码效果 源码下载…

Django后端架构开发:缓存机制,接口缓存、文件缓存、数据库缓存与Memcached缓存

深入探讨Django后端架构中的缓存机制:接口缓存、文件缓存、数据库缓存与Memcached缓存 目录 🌟 缓存接口数据的实现✨ Django文件缓存的应用⚡ 关系型数据库缓存的策略💠 Memcached缓存的配置与优化 🌟 缓存接口数据的实现 在D…

前端开发工程师面试整理-ES6+的新特性

ES6(ECMAScript 2015)及后续版本引入了许多新特性,极大地增强了JavaScript的功能和开发体验。以下是一些主要的新特性: 变量声明 1. let 和 const: ● let 声明块作用域变量。 ● const 声明常量,值不能重新赋值。 ● 示例:

从行为面试问题(behavioral questions)看中美程序员差异。

中美程序员在职场中的工作状态和职能、福利等有很大区别,从面试中的BQ轮就可见一斑。 中美程序员的面试轮差异? 国内的面试轮在不同公司间差异很大,但总体的问题类型包含笔试面试(算法题、概念题、项目深挖、职业目标、职场文化…

混合现实UI优化:利用物理环境的直接交互

随着虚拟现实(VR)和混合现实(MR)技术的发展,用户界面(UI)的设计变得越来越重要,尤其是在需要适应多种物理环境的情况下。本文将介绍一种名为 InteractionAdapt 的用户界面优化方法,它专为VR环境中的工作空间适配而设计,能够有效利用物理环境,为用户提供更加灵活和个…

【仿真与实物设计】基于51单片机设计的打地鼠游戏机——程序源码原理图proteus仿真图PCB设计文档演示视频元件清单等(文末工程资料下载)

基于51单片机设计的打地鼠游戏机 演示视频: 基于51单片机设计的打地鼠游戏机 功能描述:使用 51单片机为核心制作一个打地鼠游戏机。按下启动开关,8盏LED流水点亮并闪烁2次,随即开始播放游戏音乐,直到开始选择模式。选择的模式在数码管上显示,该游戏机共有两个模式,分别…

layui table表单 checkbox选中一个其它也要选中

当我们选中其中一个商品的时候同类型的商品状态也要跟着改变 所以要在表单加载完成后去监听checkbox ,done:function (res) {console.log(详情表格数据,res)tableDetailList res.data;// 监听表格复选框选择table.on(checkbox( INST_SELECTORS.instLayFilters.unpaidTableDe…

TypeScript 面试题汇总

引言 TypeScript 是一种由微软开发的开源、跨平台的编程语言,它是 JavaScript 的超集,为 JavaScript 添加了静态类型系统和其他高级功能。随着 TypeScript 在前端开发领域的广泛应用,掌握 TypeScript 已经成为很多开发者必备的技能之一。本文…

Canvas 动画: atan2 三角函数与鼠标跟随效果

这个案例展示了如何使用HTML5的Canvas和JavaScript实现一个动态效果:在画布上绘制一个箭头,并让它实时跟随鼠标移动。这个小项目不仅有趣,还能帮助你理解编程和基本数学概念的实际应用。 项目需求 我们的目标是在一个画布上绘制一个箭头&…

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

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

电脑浏览器打不开部分网页

电脑浏览器打不开部分网页 时间: 2024-08-25 问题描述: 电脑突然打不开部分网页 例如腾讯文档 夸克网盘 但其他网页能够正常打开 原因 可能为域名解析问题 更改DNS即可解决 解决办法 控制面板–> 网络和Internet—>网络连接—> WLAN----> 属性 —> Interne…

已解决:`javax.security.auth.RefreshFailedException` 刷新失败的正确解决方法,亲测有效!!!

在 Java 开发中,javax.security.auth.RefreshFailedException 异常通常涉及到安全认证和授权机制。这个异常通常在尝试刷新或更新认证凭证时出现问题,可能会影响到应用的安全性和稳定性。本文将详细分析该异常的原因,并提供有效的解决方法。 …