【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字段在更新时会增加,更新语句只有在原始读取的版本与数据库中的版本相匹配时才会执行成功,从而检测并发修改。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法刷题日志 —— 数组和位运算

文章目录 [461. 汉明距离](https://leetcode.cn/problems/hamming-distance/submissions/542447020/)[448. 找到所有数组中消失的数字](https://leetcode.cn/problems/find-all-numbers-disappeared-in-an-array/submissions/)[136. 只出现一次的数字](https://leetcode.cn/pro…

C# 超简单的离线人脸识别库 - ViewFaceCore

项目介绍 ViewFaceCore是一个基于 SeetaFace6 的 .NET 人脸识别解决方案。 项目特点 开源&#xff08;MIT license&#xff09;、免费、简单的离线人脸识别库。 跨平台&#xff08;适用于 Windows、MacOS 和 Linux &#xff09;。 .NET 框架 和 操作系统 封装完善的NuGet包…

openssl 命令行生成密钥对,生成hash,PSS填充签名,校验

生成密钥对(RSA4096) openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:4096 openssl rsa -pubout -in private_key.pem -out public_key.pem将源文件data.txt生成hash值&#xff08;sha-256&#xff09; openssl dgst -sha256 -binary data.t…

数字黄金 vs 全球计算机:比特币与以太坊现货 ETF 对比

撰文&#xff1a;Andrew Kang 编译&#xff1a;J1N&#xff0c;Techub News 本文来源香港Web3媒体&#xff1a;Techub News 比特币现货 ETF 的通过为许多新买家打开了进入加密货币市场的大门&#xff0c;让他们可以在投资组合中配置比特币。但以太坊现货 ETF 的通过&#xf…

YOLOv8改进 | 注意力机制 | 迈向高质量像素级回归的极化自注意力【全网独家】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有…

kafka consumer客户端消费逻辑解析

kafka consumer客户端消费逻辑解析 一、主要消费步骤二、提交策略【步骤2代码解析】【提交策略总结】 三、拉取策略&#xff08;待补充&#xff09;四、消费策略【代码解析】【消费策略总结】 一、主要消费步骤 这是kafka客户端拉取消息的入口&#xff0c;有4个主要部分 1、启…

IDEA使用Apidocx插件在RAP生成接口文档

第一步 安装插件&#xff0c;安装最新的1.1.7即可&#xff0c;插件与idea版本对照 第二步 输入对应的IP或域名&#xff0c;端口说明&#xff1a; 1. 38080&#xff1a;为后端数据 API 服务器&#xff08;rap2-delos&#xff09; 2. 3000&#xff1a;为前端静态资源服务&…

AI加持,商业智能与分析软件市场释放更大潜能

根据IDC最新发布的《中国商业智能和分析软件市场跟踪报告&#xff0c;2023H2》显示&#xff0c;2023下半年&#xff0c;中国商业智能与分析软件市场规模为5.2亿美元&#xff0c;同比增长为3.7%。其中&#xff0c;本地部署收入占比为89.3%&#xff0c;同比增长1.7%&#xff1b;公…

算法基础详解

大O记法 为了统一描述&#xff0c;大O不关注算法所用的时间&#xff0c;只关注其所用的步数。 比如数组不论多大&#xff0c;读取都只需1步。用大O记法来表示&#xff0c;就是&#xff1a;O(1)很多人将其读作“大O1”&#xff0c;也有些人读成“1数量级”。一般读成“O1”。虽…

守护矿山安全生产:AI视频分析技术在煤矿领域的应用

随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;其在煤矿行业的应用也日益广泛。AI视频智能分析技术作为其中的重要分支&#xff0c;为煤矿的安全生产、过程监测、效率提升和监管决策等提供了有力支持。 一、煤矿AI视频智能分析技术的概述 视频智慧煤矿AI…

Idea 插件 Convert YAML and Properties File

YAML 和 Properties 相互转换插件 ConvertYamlAndProperties: IntelliJ IDEA plugin - Convert Yaml And Properties Files

服务器部署—虚拟机安装nginx并部署web网页

该篇博客用于讲解Linux的Centos7发行版中如何通过Linux安装Nginx&#xff0c;然后将静态页面部署到Nginx中&#xff0c;通过浏览器访问。 非常适用于新手小白学习项目部署相关的知识。建议收藏&#xff01;&#xff01;&#xff01; 需要大家提前准备好虚拟机和CentOS7操作系统…

【博士每天一篇文献-综述】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…

docker部署vue项目

1.下载docker desktop软件 Docker Desktop启动的时候&#xff0c;有可能弹框提示"WSL2 installations is incomplete"&#xff0c;这是您的系统中没有安装WSL2内核的原因&#xff0c;打开【https://aka.ms/wsl2kernel ,在打开的页面中有一个Linux内核更新包"链…

NDT(基于正态分布变换的配准算法)

NDT是将单个扫描的离散点集转换为空间上定义的分段连续可微概率密度&#xff0c;该概率密度由一组易于计算的正态分布组成的算法。采用NDT连续化后&#xff0c;传统硬离散优化问题能够潜在地转化为更易于处理的连续优化问题。 NDT原理 NDT将根据点云中点所处的位置&#xff0…

AudioLM音频生成模型

GPT-4o (OpenAI) AudioLM&#xff08;Audio Language Model&#xff09;是一种生成音频的深度学习模型。它可以通过学习语言模型的结构来生成连贯和高质量的音频信号。这类模型通常应用于语音合成、音乐生成和音频内容生成等领域。以下是一些与AudioLM相关的核心概念和技术细…

基于uni-app与图鸟UI的移动应用模板构建研究

摘要 随着移动互联网技术的迅猛发展&#xff0c;移动端应用已成为企业展示形象、提供服务的重要窗口。本文基于uni-app框架和图鸟UI设计&#xff0c;深入探讨了如何高效构建覆盖多个领域的移动端应用模板。通过对商城、办公、投票、生活服务等多种类型模板的详细介绍&#xff…

【数据结构与算法】内部排序算法 详解

指出希尔排序&#xff0c;归并排序&#xff0c;快速排序&#xff0c;堆排序&#xff0c;基数排序中稳定的排序方法&#xff0c;并对不稳定的举出反例。 稳定的排序算法是指&#xff0c;如果两个元素相等&#xff0c;它们在排序后的顺序与排序前的顺序相同。 上述算法中稳定的…

昇思25天学习打卡营第10天|基于MindSpore的GPT2文本摘要

学AI还能赢奖品&#xff1f;每天30分钟&#xff0c;25天打通AI任督二脉 (qq.com) 基于MindSpore的GPT2文本摘要 %%capture captured_output # 实验环境已经预装了mindspore2.2.14&#xff0c;如需更换mindspore版本&#xff0c;可更改下面mindspore的版本号 !pip uninstall m…

Duix - 硅基数字人SDK

简介 Introduction DUIX(Dialogue User Interface System)是硅基智能打造的AI数字人智能交互平台。通过将数字人交互能力开源,开发者可自行接入多方大模型、语音识别(ASR)、语音合成(TTS)能力,实现数字人实时交互,并在Android和iOS多终端一键部署,让每个开发者可轻松…