【PostgreSQL】守护数据安全:事务与数据完整性管理

目录

事务管理:确保操作的原子性

事务的概念与重要性

事务的启动与提交

事务的回滚(ROLLBACK)(

数据一致性与隔离级别

隔离级别的解释

设置隔离级别

错误处理与事务的高级策略

异常处理(SAVEPOINT & EXCEPTION)

自动提交与手动控制

注意

并发控制与锁

悲观锁(Pessimistic Lock)

乐观锁(Optimistic Lock)


事务管理:确保操作的原子性

    事务是数据库操作的基本单位,确保数据的一致性和完整性,本节深入探讨事务的定义、启动与结束。

事务的概念与重要性

事务是一系列操作的集合,这些操作要么全部成功,要么全部失败,保持数据的原子性。理解事务对于防止数据不一致至关重要。

事务的启动与提交
  • BEGIN:显式开启一个新的事务。
BEGIN;
INSERT INTO accounts (balance) VALUES (1000);
  • COMMIT:提交事务,永久保存更改。
    COMMIT;
    事务的回滚(ROLLBACK)(
  • 当事务中的一部分操作失败时,使用ROLLBACK撤销所有已做的更改。
    /*由于错误,账户余额减少的操作被撤销,保持数据的原始状态。*/
    BEGIN;
    UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
    -- 假设这里出现了一个错误
    ROLLBACK;
    数据一致性与隔离级别

    理解事务的隔离级别是处理并发操作时保持数据一致性的关键。

    隔离级别的解释
  • READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE:从低到高依次提供更强的隔离性,但也可能影响并发性能。

  • 示例说明隔离级别差异:

    -- 假设有两个事务T1和T2同时操作账户表
    -- 在SERIALIZABLE级别下,T1的读取不会看到T2未提交的更改,确保数据的一致性。
    设置隔离级别
  • 显示当前会话的隔离级别:
SHOW transaction_isolation;
  • 修改隔离级别:
    SET SESSION transaction_isolation TO 'REPEATABLE READ';
    错误处理与事务的高级策略

    掌握如何在遇到错误时优雅地处理事务,以及使用保存点和异常块等高级特性。

    异常处理(SAVEPOINT & EXCEPTION)
  • 使用SAVEPOINT标记事务中的特定点,以便在遇到错误时回滚到该点而不是整个事务。
    BEGIN;
    SAVEPOINT before_update;
    UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
    -- 如果更新失败
    ROLLBACK TO SAVEPOINT before_update;
    自动提交与手动控制

     在PostgreSQL中,事务的管理对于数据一致性和可靠性至关重要。以下是关于PostgreSQL自动提交与手动控制事务的区别:

特性自动提交模式手动提交模式
默认行为默认开启(大多数情况下,除非特定配置更改)需要手动开启,某些版本或配置下可能为默认
事务边界每个SQL语句执行完后自动提交,形成独立事务事务开始于BEGIN,结束于COMMITROLLBACK
控制粒度粗粒度,每个操作自动完成细粒度,允许一组操作作为一个整体提交或回滚
数据修改即时性数据修改立即生效,无法撤销单个语句数据修改直到COMMIT才对外可见,可控制回滚
示例代码直接执行SQL语句,如 INSERT INTO table VALUES (...);BEGIN; <SQL操作>; COMMIT; 或 ROLLBACK;
适用场景快速操作,无需复杂事务逻辑或高度一致性的简单应用需要精确控制事务边界,保证数据完整性和一致性
注意
  • 自动提交简化了编程模型,减少了忘记提交事务的风险,但可能不适合需要多个操作原子性完成的场景。
  • 手动提交提供了更细粒度的控制,适用于需要执行多条SQL语句且这些语句必须全部成功或全部失败的情况。
  • 在PostgreSQL中,可以通过设置AUTOCOMMIT参数来改变默认行为,例如使用SET AUTOCOMMIT TO OFF;来关闭自动提交,进入手动提交模式。
并发控制与锁

    在PostgreSQL中,悲观锁和乐观锁是两种不同的并发控制策略,用于处理多用户环境下对共享资源的访问,以避免数据不一致性和并发冲突。

悲观锁(Pessimistic Lock)

     悲观锁假定在事务处理过程中数据很可能发生并发冲突,因此采取一种预防性的锁定策略。在开始读取或修改数据前,悲观锁会先锁定数据,确保在整个事务期间,没有其他事务能够修改这些数据。这种方式可以有效防止并发冲突,但可能会降低系统的并发性能,因为资源被锁定期间,其他需要访问这些资源的事务会被阻塞等待。

在PostgreSQL中,可以使用SELECT ... FOR UPDATESELECT ... FOR SHARE语句显式地申请悲观锁。这些锁会在事务结束时自动释放,无论是通过COMMIT还是ROLLBACK。例如:

BEGIN;
SELECT * FROM my_table WHERE id = 1 FOR UPDATE;
-- 进行一些业务逻辑处理...
COMMIT;

这段代码会锁定id为1的行,阻止其他事务修改或删除这行数据,直到当前事务结束。

乐观锁(Optimistic Lock)

乐观锁则假设在事务处理过程中数据并发冲突的概率较低,因此它不会一开始就锁定数据。相反,乐观锁会在事务开始时记录数据的一个版本标识(通常是通过在表中添加一个版本字段,如version),然后在事务提交前检查数据的版本是否发生变化。如果版本未变,说明没有冲突,事务可以正常提交;如果有其他事务已经修改了数据(即版本号不同),则当前事务通常会回滚,由应用程序决定如何处理这种情况(如重新尝试事务)。

在PostgreSQL中,乐观锁的实现依赖于应用程序的逻辑,通常涉及在更新时检查数据版本。例如:

  • 读取数据时,同时读取版本字段:
SELECT * FROM my_table WHERE id = 1;
  • 更新数据时,比较版本字段:
    BEGIN;
    UPDATE my_table 
    SET column = value, version = version + 1 
    WHERE id = 1 AND version = original_version_from_read;-- 如果影响行数为0,表示版本不匹配,可能有并发修改
    GET DIAGNOSTICS result = ROW_COUNT;
    IF result = 0 THEN-- 处理并发冲突,如回滚事务或重新尝试
    END IF;
    COMMIT;

        在这个例子中,version字段在更新时会增加,更新语句只有在原始读取的版本与数据库中的版本相匹配时才会执行成功,从而检测并发修改。

      悲观锁适用于并发冲突频繁、对数据一致性和实时性要求较高的场景,而乐观锁适用于并发冲突较少、追求高并发性能的场景。选择哪种锁策略需根据实际应用场景权衡。

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

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

相关文章

25届最近5年重庆邮电大学自动化考研院校分析

重庆邮电大学 目录 一、学校学院专业简介 二、考试科目指定教材 三、近5年考研分数情况 四、近5年招生录取情况 五、最新一年分数段图表 六、历年真题PDF 七、初试大纲复试大纲 八、学费&奖学金&就业方向 一、学校学院专业简介 二、考试科目指定教材 1、考试…

[数据集][目标检测]电缆钢丝绳线缆缺陷检测数据集VOC+YOLO格式1800张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1800 标注数量(xml文件个数)&#xff1a;1800 标注数量(txt文件个数)&#xff1a;1800 标注…

单例模式(下)

文章目录 文章介绍步骤安排及单例讲解step1&#xff1a;注册单例类型&#xff08;main.cpp&#xff09;step2&#xff1a;定义类和私有构造函数&#xff08;keyboardinputmanager.h&#xff09;step3:&#xff08;keyboardinputmanager.cpp&#xff09;step4&#xff1a;在qml中…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 特殊加密算法(200分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

Rust 跨平台-Android 和鸿蒙 OS

1. 安装 rustup rustup 是 Rust 的安装和版本管理工具 $ curl --proto https --tlsv1.2 https://sh.rustup.rs -sSf | sh 该命令会安装 rusup 和最新的稳定版本的 Rust&#xff1b;包括&#xff1a; rustc Rust 编译器&#xff0c;用于将 Rust 代码编译成可执行文件或库。 ca…

技术速递|Visual Studio Code 的 .NET MAUI 扩展现已正式发布

作者&#xff1a;Maddy Montaquila 排版&#xff1a;Alan Wang 今天&#xff0c;我们非常高兴地宣布 .NET MAUI VS Code 扩展插件结束了预览阶段&#xff0c;并将包含一些期待已久的新功能 - 包括 XAML IntelliSense 和 Hot Reload&#xff01; 什么是 .NET MAUI 扩展插件&…

GuLi商城-商品服务-API-三级分类-删除-页面效果

一步步学习Vue太慢了&#xff0c;准备跳过前端的学习&#xff0c;直接使用前端完整的项目 下载依赖npm install&#xff0c;会报错&#xff0c;排查了好久 我安装的是Node14&#xff0c;所以必须要安装4.14 Vscode终端输入&#xff1a;npm install node-sass4.14 输入&#x…

【博士每天一篇文献-综述】A survey on few-shot class-incremental learning

阅读时间&#xff1a;2023-12-19 1 介绍 年份&#xff1a;2024 作者&#xff1a;田松松&#xff0c;中国科学院半导体研究所&#xff1b;李璐思&#xff0c;老道明大学助理教授&#xff1b;李伟军&#xff0c;中国科学院半导体研究所AnnLab&#xff1b; 期刊&#xff1a; Neu…

LearnOpenGL - Android OpenGL ES 3.0 使用 FBO 进行离屏渲染

系列文章目录 LearnOpenGL 笔记 - 入门 01 OpenGLLearnOpenGL 笔记 - 入门 02 创建窗口LearnOpenGL 笔记 - 入门 03 你好&#xff0c;窗口LearnOpenGL 笔记 - 入门 04 你好&#xff0c;三角形OpenGL - 如何理解 VAO 与 VBO 之间的关系LearnOpenGL - Android OpenGL ES 3.0 绘制…

《Windows API每日一练》6.4 程序测试

前面我们讨论了鼠标的一些基础知识&#xff0c;本节我们将通过一些实例来讲解鼠标消息的不同处理方式。 本节必须掌握的知识点&#xff1a; 第36练&#xff1a;鼠标击中测试1 第37练&#xff1a;鼠标击中测试2—增加键盘接口 第38练&#xff1a;鼠标击中测试3—子窗口 第39练&…

vite-ts-cesium项目集成mars3d修改相关的包和配置参考

如果vite技术栈下使用原生cesium&#xff0c;请参考下面文件的包和配置修改&#xff0c;想用原生创建的viewer结合我们mars3d的功能的话。 1. package.json文件 "dependencies": {"cesium": "^1.103.0","mars3d": "^3.7.18&quo…

深度学习 - Transformer 组成详解

整体结构 1. 嵌入层&#xff08;Embedding Layer&#xff09; 生活中的例子&#xff1a;字典查找 想象你在读一本书&#xff0c;你不认识某个单词&#xff0c;于是你查阅字典。字典为每个单词提供了一个解释&#xff0c;帮助你理解这个单词的意思。嵌入层就像这个字典&#xf…

Micrometer+ZipKin分布式链路追踪

目录 背景MicrometerMicrometer与ZipKin之间的关系专业术语分布式链路追踪原理 ZipKin安装下载 MicrometerZipKin 案例演示相关文献 背景 一个系统页面上的按钮点击到结果反馈&#xff0c;在微服务框架里&#xff0c;是由N个服务组成返回结果&#xff0c;中间可能经过a->b-…

【Electron】Electron入门实现

Electron 学习笔记 Electron 是一个开源框架&#xff0c;允许开发者使用网页技术&#xff08;HTML、CSS 和 JavaScript&#xff09;来构建跨平台的桌面应用程序。它由 GitHub 开发并维护&#xff0c;最初是为了支持开发 Atom 编辑器。Electron 结合了 Chromium&#xff08;用于…

密码学及其应用 —— 对称加密技术

1. 对称加密、流加密和块加密 1.1 对称加密 对称加密&#xff08;也称为密钥加密&#xff09;是一种加密方式&#xff0c;其中加密和解密使用相同的密钥。这种加密方法基于二进制层面的操作&#xff0c;如XOR&#xff08;异或&#xff09;、SHIFT&#xff08;位移&#xff09;…

Redis Stream Redisson Stream

目录 一、Redis Stream1.1 场景1&#xff1a;多个客户端可以同时接收到消息1.1.1 XADD - 向stream添加Entry&#xff08;发消息 &#xff09;1.1.2 XREAD - 从stream中读取Entry&#xff08;收消息&#xff09;1.1.3 XRANGE - 从stream指定区间读取Entry&#xff08;收消息&…

【DevExpress】WPF DevExpressMVVM 24.1版本开发指南

DevExpressMVVM WPF 环境安装 前言重要Bug&#xff08;必看&#xff09;环境安装控件目录Theme 主题LoginWindow 登陆窗口INavigationService 导航服务DockLayout Dock类型的画面布局TreeView 树状列表注意引用类型的时候ImageSource是PresentationCore程序集的博主找了好久&am…

Navicat 外网连接 mysql (1、通过SSH方式内网访问 2、对外开放3306端口)

1、通过SSH方式内网访问 直接常规方式使用IP、账号密码连接&#xff0c;失败 SSH方式&#xff1a; 常规 选项卡中&#xff1a;localhost录入数据库账号密码 SSH 选项卡中&#xff1a;勾选使用SSH&#xff0c;输入服务器IP、账号、密码 如果出现该错误&#xff0c;可能是服务器…

Windows下activemq开启jmx

1.activemq版本信息 activemq&#xff1a;apache-activemq-5.18.4 2.Windows下activemq开启jmx 1.进入activemq conf目录&#xff0c;备份activemq.xml文件 2.编辑activemq.xml文件&#xff0c;在broker节点增加useJmx"true" <broker xmlns"http://active…

无线通讯几种常规天线类别简介

天线对于无线模块来说至关重要&#xff0c;合适的天线可以优化通信网络&#xff0c;增加其通信的范围和可靠性。天线的选型对最后的模块通信影响很大&#xff0c;不合适的天线会导致通信质量下降。针对不同的市场应用&#xff0c;天线的材质、安置方式、性能也大不一样。下面简…