【PostgreSQL】提高篇——数据库事务管理与隔离级别

在现代数据库管理系统中,事务是确保数据一致性和完整性的重要机制。本文将深入探讨事务的概念、ACID 特性,以及不同的隔离级别(如 READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE)。

1. 事务的概念

1.1 什么是事务?

事务是数据库管理系统(DBMS)中的一个重要概念,它是一个由一系列操作组成的逻辑单元,这些操作要么全部成功,要么全部失败。事务确保了数据的一致性和完整性。常见的事务场景包括银行转账、订单处理等。

1.2 事务的特性

事务具有以下四个特性,通常称为 ACID 特性:

  • 原子性(Atomicity):事务中的所有操作要么全部执行成功,要么全部不执行。如果事务中的某个操作失败,整个事务将被回滚到事务开始之前的状态。

  • 一致性(Consistency):事务在执行前后,数据库的状态必须保持一致。即使在事务执行过程中出现错误,数据库也不会处于不一致的状态。

  • 隔离性(Isolation):多个事务并发执行时,彼此之间不会互相干扰。每个事务的执行是独立的,仿佛它是唯一在系统中执行的事务。

  • 持久性(Durability):一旦事务提交,其结果是永久性的,即使系统崩溃,已提交的事务的结果也不会丢失。

2. 隔离级别

隔离级别定义了一个事务与其他事务之间的可见性和影响程度。SQL 标准定义了四种隔离级别,每种隔离级别都有其优缺点,适用于不同的应用场景。

2.1 READ UNCOMMITTED

在此隔离级别下,一个事务可以读取另一个事务未提交的数据。这可能导致脏读(Dirty Read)。

优缺点
  • 优点

    • 允许更高的并发性,性能较好。
    • 适用于对数据一致性要求不高的场景。
  • 缺点

    • 可能导致脏读,数据不可靠。
    • 不适合需要严格数据一致性的应用。
示例:READ UNCOMMITTED

假设我们有一个简单的 accounts 表,记录用户的账户余额。

CREATE TABLE accounts (id SERIAL PRIMARY KEY,name VARCHAR(100),balance DECIMAL
);INSERT INTO accounts (name, balance) VALUES ('Alice', 1000), ('Bob', 500);

现在,我们开始两个事务:

事务 1:增加 Alice 的余额,但尚未提交。

BEGIN;  -- 开始事务 1
UPDATE accounts SET balance = balance + 100 WHERE name = 'Alice';  -- Alice 的余额变为 1100

事务 2:读取 Alice 的余额。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;  -- 设置隔离级别为 READ UNCOMMITTED
BEGIN;  -- 开始事务 2
SELECT * FROM accounts WHERE name = 'Alice';  -- 读取 Alice 的余额

结果

  • 事务 2 可以看到 Alice 的余额是 1100,尽管事务 1 尚未提交。这是一个脏读的例子。

2.2 READ COMMITTED

在此隔离级别下,一个事务只能读取已提交的数据。脏读被防止,但不可重复读(Non-repeatable Read)仍然可能发生。

优缺点
  • 优点

    • 防止脏读,数据更可靠。
    • 适用于大多数应用场景,平衡了并发性和一致性。
  • 缺点

    • 可能出现不可重复读,数据在事务执行期间可能发生变化。
示例:READ COMMITTED

继续使用 accounts 表,假设我们现在将事务 2 的隔离级别更改为 READ COMMITTED。

事务 1:仍然在增加 Alice 的余额。

BEGIN;  -- 事务 1
UPDATE accounts SET balance = balance + 100 WHERE name = 'Alice';  -- Alice 的余额变为 1100

事务 2:读取 Alice 的余额。

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;  -- 设置隔离级别为 READ COMMITTED
BEGIN;  -- 事务 2
SELECT * FROM accounts WHERE name = 'Alice';  -- 读取 Alice 的余额

结果

  • 事务 2 只能看到 Alice 的余额为 1000,因为事务 1 尚未提交。
  • 如果事务 1 提交后,事务 2 再次读取 Alice 的余额,则会看到 1100。这是一个不可重复读的例子。

2.3 REPEATABLE READ

在此隔离级别下,一个事务在执行期间可以多次读取同一数据集,并且每次读取的结果都是一致的。脏读和不可重复读都被防止,但幻读(Phantom Read)仍然可能发生。

优缺点
  • 优点

    • 防止脏读和不可重复读,数据一致性更高。
    • 适合需要多次读取同一数据的场景。
  • 缺点

    • 可能出现幻读,尤其是在插入或删除操作时。
示例:REPEATABLE READ

我们将事务 2 的隔离级别更改为 REPEATABLE READ。

事务 1:增加 Alice 的余额并提交。

BEGIN;  -- 事务 1
UPDATE accounts SET balance = balance + 100 WHERE name = 'Alice';  -- Alice 的余额变为 1100
COMMIT;  -- 提交事务 1

事务 2:读取 Alice 的余额。

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;  -- 设置隔离级别为 REPEATABLE READ
BEGIN;  -- 事务 2
SELECT * FROM accounts WHERE name = 'Alice';  -- 读取 Alice 的余额

结果

  • 事务 2 将始终看到 Alice 的余额为 1000,即使事务 1 已提交并将其余额更新为 1100。这是因为 REPEATABLE READ 确保了在事务 2 的整个执行期间,读取的结果保持一致。

2.4 SERIALIZABLE

在此隔离级别下,事务完全隔离,仿佛它们是串行执行的。脏读、不可重复读和幻读都被防止。

优缺点
  • 优点

    • 提供最高级别的数据一致性,适合关键业务操作。
    • 防止所有类型的读问题。
  • 缺点

    • 性能开销较大,可能导致事务冲突和等待。
    • 适合对一致性要求极高的场景,但不适合高并发的环境。
示例:SERIALIZABLE

我们将事务 2 的隔离级别更改为 SERIALIZABLE。

事务 1:增加 Alice 的余额并提交。

BEGIN;  -- 事务 1
UPDATE accounts SET balance = balance + 100 WHERE name = 'Alice';  -- Alice 的余额变为 1100
COMMIT;  -- 提交事务 1

事务 2:尝试读取 Alice 的余额。

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;  -- 设置隔离级别为 SERIALIZABLE
BEGIN;  -- 事务 2
SELECT * FROM accounts WHERE name = 'Alice';  -- 读取 Alice 的余额

结果

  • 事务 2 将看到 Alice 的余额为 1100,因为事务 1 已提交。
  • 如果事务 2 试图在读取后更新 Alice 的余额,可能会引发错误,提示由于并发冲突而无法完成操作。

3. 实际应用案例

3.1 银行转账

在银行转账的场景中,确保数据一致性至关重要。我们需要确保在从一个账户扣款的同时,另一个账户能够正确接收这笔款项。

BEGIN;  -- 开始转账事务
UPDATE accounts SET balance = balance - 100 WHERE name = 'Alice';  -- 从 Alice 的账户扣款
UPDATE accounts SET balance = balance + 100 WHERE name = 'Bob';    -- 向 Bob 的账户存款
COMMIT;  -- 提交事务

在这个例子中,使用 SERIALIZABLE 隔离级别可以确保在整个转账过程中,数据的一致性和完整性。

3.2 电子商务订单处理

在电子商务系统中,订单处理通常涉及多个数据库操作,例如更新库存、生成订单记录等。使用 REPEATABLE READ 隔离级别可以确保在处理订单时,读取的库存数量在整个事务期间保持一致。

BEGIN;  -- 开始订单处理事务
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;  -- 设置隔离级别
SELECT stock FROM products WHERE id = 1;  -- 查询商品库存
UPDATE products SET stock = stock - 1 WHERE id = 1;  -- 更新库存
INSERT INTO orders (product_id, quantity) VALUES (1, 1);  -- 生成订单
COMMIT;  -- 提交事务

4. 错误处理

在处理事务时,可能会遇到各种错误,例如死锁、数据完整性约束失败等。为了确保事务的安全性和可靠性,通常会使用 ROLLBACK 语句来撤销未完成的事务。

示例:错误处理

BEGIN;  -- 开始事务
BEGIN TRYUPDATE accounts SET balance = balance - 100 WHERE name = 'Alice';  -- 从 Alice 的账户扣款UPDATE accounts SET balance = balance + 100 WHERE name = 'Bob';    -- 向 Bob 的账户存款COMMIT;  -- 提交事务
END TRY
BEGIN CATCHROLLBACK;  -- 如果出现错误,撤销事务PRINT 'Error occurred: ' + ERROR_MESSAGE();  -- 输出错误信息
END CATCH;

5. 进一步阅读

  • 《SQL Performance Explained》(作者:Markus Winand):深入了解 SQL 查询性能和事务的影响。

6. 总结

这篇文章探讨了数据库事务的概念、ACID 特性以及不同的隔离级别(READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE)。通过具体的示例,演示了这些概念的实际应用,并解释了每个隔离级别的行为和影响。

希望对你有所帮助。

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

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

相关文章

【深度学习总结】热力图-Grad-CAM使用

Grad-CAM使用 介绍 Grad-CAM,全称为Gradient-weighted Class Activation Mapping,是一种用于深度学习模型可视化的技术,特别是在卷积神经网络(CNN)中。它通过生成热力图来展示模型在做出决策时关注的区域&#xff0c…

Hotspot是什么?

Hotspot 简单来说,JVM的一种。 一、HotSpot 的官方定义 HotSpot 是 Oracle 公司开发的一个高性能的 Java 虚拟机(JVM)。它通过一系列先进的技术和优化手段,为 Java 应用程序提供高效的运行环境,实现了跨平台的代码执行…

【JS】判断快乐数

思路 这里主要是需要熟悉对取值各个位数上的单数操作,也就是数字拆分方法: 转化为字符串,使用split方法 // 将数字转换为字符串,以便拆分为单个数字 let arr ( (totalCount || n)).split(); 使用数学运算符 let sum 0; // 初始…

第二十二天|回溯算法| 理论基础,77. 组合(剪枝),216. 组合总和III,17. 电话号码的字母组合

目录 回溯算法理论基础 1.题目分类 2.理论基础 3.回溯法模板 补充一个JAVA基础知识 什么时候用ArrayList什么时候用LinkedList 77. 组合 未剪枝优化 剪枝优化 216. 组合总和III 17. 电话号码的字母组合 回溯法的一个重点理解:细细理解这句话!…

《Linux从小白到高手》理论篇:Linux的进程管理详解

本篇将介绍Linux的进程管理相关知识,并将深入介绍Linux的进程间相互通信。 进程就是运行中的程序,一个运行着的程序,可能有多个进程。 比如Oracle DB,启动Oracle实例服务后,就会有多个进程。 Linux进程分类 在 Linux…

五、Python基础语法(程序的输入和输出)

一、输入 输入:输入就是获取键盘输入的数据,使用input()函数。代码会从上往下执行,当遇到input()函数,就会暂停执行,输入内容后,敲回车键,表示本次的输入结束。input函数得到的数据类型都是字符…

Kali Linux中安装配置影音资源下载神器Amule

一、Debian系列Linux安装amule命令: sudo apt update sudo apt-get install amule amule-utils 二、配置Amule的要点: 1、首次运行Amule,提示是否下载服务器列表,点击是。 2、搜索选项的类型选择全球,类型的默认选项…

cs61b学习 part3

如果你有许多list,这里将会是大量的时间,我指的是对于单向链表查找时间复杂度O(N)相对于数组O(1)的时间复杂度会慢一些 所以这究竟是顺序表的编写还是链表的改进? IntList public class IntList {public int first;public IntList rest;public IntLis…

后端增删改查的基本应用——一个简单的货物管理系统

最终效果,如图所示: 如果想要进行修改操作,可点击某栏修改选项,会在本表格下方弹出修改的具体操作界面(点击前隐藏),并且目前的信息可复现在修改框内。 本篇文章通过该项目将后端和前端结合起来…

编译链接的过程发生了什么?

一:程序的翻译环境和执行环境 在 ANSI C 的任何一种实现中,存在两个不同的环境。 第 1 种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。 第 2 种是执行环境,它用于实际执行代码 也就是说:↓ 1&#xff1…

微信小程序启动不起来,报错凡是以~/包名/*.js路径的文件,都找不到,试过网上一切方法,最终居然这么解决的,【避坑】命运的齿轮开始转动

app.json "resolveAlias": {"~/*": "/*"},文件代码也没有问题,网上的方法试过来了,大模型AI也问过遍,熬夜到凌晨2点半,最不可思议的是居然是因为微信开发者工具版本的问题,我真的是笑死…

网站排名,让网站快速有排名的几个方法

要让网站快速获得并提升排名,需要综合运用一系列专业策略和技术,这些策略涵盖了内容优化、技术调整、外链建设、用户体验提升等多个方面。以下是让网站快速有排名的几个方法: 1.内容为王:创造高质量、有价值的内容 -深入…

南京大学《软件分析》李越, 谭添——1. 导论

导论 主要概念: soundcompletePL领域概述 动手学习 本节无 文章目录 导论1. PL(Programming Language) 程序设计语言1.1 程序设计语言的三大研究方向1.2 与静态分析相关方向的介绍与对比静态程序分析动态软件测试形式化(formal)语义验证(verification) 2. 静态分析:2.1莱斯…

Redis数据库与GO(一):安装,string,hash

安装包地址:https://github.com/tporadowski/redis/releases 建议下载zip版本,解压即可使用。解压后,依次打开目录下的redis-server.exe和redis-cli.exe,redis-cli.exe用于输入指令。 一、基本结构 如图,redis对外有个…

k8s的安装和部署

配置三台主机,分别禁用各个主机上的swap,并配置解析 systemctl mask swap.target swapoff -a vim /etc/fstab配置这三个主机上的主机以及harbor仓库的主机 所有主机设置docker的资源管理模式为system [rootk8s-master ~]# vim /etc/docker/daemon.json…

为什么推荐你一定要弄懂千门八将108局,学会做局思维的人有多么的厉害?

在纷繁复杂的社会与商业环境中,能够洞悉事物本质、预见趋势并巧妙布局的人,往往能在竞争中脱颖而出,成为时代的弄潮儿。而“千门八将108局”这一古老而深邃的智慧体系,不仅蕴含了中国传统文化中对于策略、心理学、人际交往的深刻理…

PCL 提取点云边界

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 计算法向量 2.1.2 提取边界点 2.1.3 可视化边界点 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总&#xff0…

动手学深度学习(李沐)PyTorch 第 6 章 卷积神经网络

李宏毅-卷积神经网络CNN 如果使用全连接层:第一层的weight就有3*10^7个 观察 1:检测模式不需要整张图像 很多重要的pattern只要看小范围即可 简化1:感受野 根据观察1 可以做第1个简化,卷积神经网络会设定一个区域&#xff0c…

SolarWinds中如何添加华为交换机实现网络管理

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 下午好,我的网工朋友。 SolarWinds作为一款广受好评的网络管理软件,它提供了全面的网络配置、监控和管理解决方案&#x…

组织病理学图像中的再识别|文献速递--基于多模态-半监督深度学习的病理学诊断与病灶分割

Title 题目 Re-identification from histopathology images 组织病理学图像中的再识别 01 文献速递介绍 在光学显微镜下评估苏木精-伊红(H&E)染色切片是肿瘤病理诊断中的标准程序。随着全片扫描仪的出现,玻片切片可以被数字化为所谓…