滚雪球学Oracle[3.4讲]:事务控制与锁管理

news/2024/10/3 11:32:51 标签: oracle, 数据库, 事务控制, 事务, 锁管理

全文目录:

    • 前言
    • 一、事务隔离级别的深入探讨
      • 1.1 事务的定义与基本特性
      • 1.2 事务隔离级别的概念
      • 1.3 各隔离级别中的问题
        • 案例演示:不同隔离级别的行为
      • 1.4 隔离级别与性能的权衡
    • 二、锁的种类与死锁问题解决
      • 2.1 锁的种类
      • 2.2 锁的粒度
      • 2.3 死锁与解决策略
        • 死锁的检测与预防
        • 案例演示:死锁检测与解决
    • 三、多版本并发控制(MVCC)的实现原理
      • 3.1 MVCC的概念
      • 3.2 MVCC的工作原理
        • 案例演示:MVCC的工作示例
      • 3.3 MVCC的优缺点
        • 优点:
        • 缺点:
    • 四、总结与下期预告

前言

在上期【数据定义语言(DDL)】的文章中,我们详细讲解了如何使用DDL命令来创建、修改和删除数据库对象,例如表、索引和视图。DDL操作在数据库设计与结构优化中起着至关重要的作用。但在日常操作中,如何确保多个用户同时对数据进行操作时仍能保证数据一致性和系统性能呢?这就涉及到事务控制>事务控制和锁管理

本期内容将从数据库的并发控制与事务管理角度出发,深入探讨事务隔离级别的概念,解释不同的隔离级别如何影响事务的并发性与一致性。同时,我们将详细介绍数据库锁的种类与死锁问题的解决方案,并解析**多版本并发控制(MVCC)**的实现原理。这些知识是数据库高效运行和数据一致性的基础。

在文章的最后,我们将对下期内容【Oracle特有的SQL功能】做预告,进一步探讨Oracle独特的SQL功能及其应用场景。


一、事务隔离级别的深入探讨

1.1 事务的定义与基本特性

事务数据库操作的一个逻辑单元,由一组SQL语句组成,要么全部执行成功,要么全部失败。事务的主要特性可以用ACID来描述:

  • 原子性(Atomicity)事务中的所有操作要么全部成功,要么全部回滚。
  • 一致性(Consistency)事务执行后,数据库从一个一致状态转换为另一个一致状态。
  • 隔离性(Isolation):一个事务的操作不会影响其他事务的操作。
  • 持久性(Durability):一旦事务提交,结果将永久保存在数据库中,即使系统崩溃也不会丢失。

1.2 事务隔离级别的概念

数据库为了支持并发操作,定义了四种标准的事务隔离级别,以不同的方式处理并发事务对共享数据的访问。这些隔离级别分别是:

  1. 读未提交(Read Uncommitted)事务可以读取其他未提交事务修改的数据。
  2. 读已提交(Read Committed)事务只能读取已提交事务的数据。
  3. 可重复读(Repeatable Read):在事务执行期间,读取的数据不会被其他事务修改。
  4. 可串行化(Serializable):最高级别,事务完全隔离,像是按顺序执行。

1.3 各隔离级别中的问题

不同的隔离级别解决了不同的并发问题,但也带来了性能和并发性的权衡。主要的问题包括:

  • 脏读(Dirty Read):读取到其他未提交事务修改的数据。
  • 不可重复读(Non-repeatable Read):在同一事务中两次读取同一数据,结果不同。
  • 幻读(Phantom Read):一个事务在多次查询中看到的记录数量不一致,通常发生在INSERTUPDATEDELETE操作引发的行变化时。
案例演示:不同隔离级别的行为

假设有两个事务事务A和事务B。

-- 事务A: 读取employee表中的数据
BEGIN TRANSACTION;
SELECT * FROM employee WHERE id = 1;

-- 事务B: 更新employee表中的数据
BEGIN TRANSACTION;
UPDATE employee SET salary = salary + 1000 WHERE id = 1;
-- 事务B未提交
  • 读未提交事务A可以读取到事务B未提交的数据,即salary增加后的值。
  • 读已提交事务A只能读取事务B提交后的数据。如果事务B还未提交,事务A将看到原始数据。
  • 可重复读事务A在整个事务期间看到的数据将保持一致,不会看到事务B的修改,哪怕事务B已提交。
  • 可串行化事务A与事务B互相隔离,完全串行化执行,事务A可能需要等待事务B完成。

1.4 隔离级别与性能的权衡

  • 低隔离级别(如读未提交):允许更高的并发性,但数据一致性较低,可能出现脏读。
  • 高隔离级别(如可串行化):确保数据的一致性,但事务执行的代价较高,系统吞吐量下降。

为了在性能和一致性之间取得平衡,大多数数据库系统(包括Oracle)默认采用读已提交隔离级别。


二、锁的种类与死锁问题解决

2.1 锁的种类

数据库通过锁来管理并发事务的操作,确保多个事务对同一数据的并发操作不会导致数据不一致。常见的锁类型包括:

  • 共享锁(S锁):允许多个事务同时读取数据,但禁止修改。
  • 排他锁(X锁):禁止其他事务读取或修改被锁定的数据。
  • 意向锁(Intent Lock):标识一个事务准备在更高级别上对某个资源加锁,通常用于表级锁和行级锁的结合。

2.2 锁的粒度

锁的粒度指的是锁定数据的范围,锁的粒度越小,并发性能越高,但锁的管理开销也越大。

  • 表级锁:锁定整个表,通常在DDL操作或涉及全表更新时使用。
  • 行级锁:锁定单行记录,允许更高的并发性,适合高频率的DML操作。

2.3 死锁与解决策略

死锁是指两个或多个事务相互等待对方释放锁,导致系统进入一种永久等待状态。虽然数据库能够检测并中止其中一个事务以解除死锁,但死锁仍会影响系统性能。

死锁的检测与预防
  1. 避免持有锁的时间过长:尽量缩短事务执行的时间,避免长时间持有锁,减少产生死锁的机会。
  2. 按固定顺序访问资源:确保所有事务在访问共享资源时遵循相同的顺序,避免循环依赖。
  3. 使用锁超时机制:设置锁超时,当事务等待超过设定时间后自动放弃锁,以减少死锁的发生。
案例演示:死锁检测与解决
-- 事务A锁定行1
BEGIN TRANSACTION;
UPDATE employees SET salary = salary * 1.1 WHERE id = 1;

-- 事务B锁定行2
BEGIN TRANSACTION;
UPDATE employees SET salary = salary * 1.1 WHERE id = 2;

-- 事务A尝试锁定行2(等待事务B释放锁)
UPDATE employees SET salary = salary * 1.1 WHERE id = 2;

-- 事务B尝试锁定行1(等待事务A释放锁)
UPDATE employees SET salary = salary * 1.1 WHERE id = 1;

-- 产生死锁,数据库系统中止其中一个事务

在这种情况下,数据库会检测到死锁,并回滚其中一个事务(如事务A),使事务B能够继续完成操作。


三、多版本并发控制(MVCC)的实现原理

3.1 MVCC的概念

**多版本并发控制(MVCC,Multi-Version Concurrency Control)**是一种常用的并发控制技术,它通过为同一数据的不同版本提供并发访问来避免锁定冲突。在MVCC模型下,读操作不阻塞写操作,写操作也不阻塞读操作。这大大提升了数据库的并发性能。

MVCC的核心思想是,每当事务修改数据时,数据库会创建数据的一个新版本,而旧版本继续对其他事务可见,直到事务提交。这样一来,读事务永远不会被写事务阻塞,因为它总是能够读取到旧版本的数据。

3.2 MVCC的工作原理

当一个事务启动时,数据库会为它创建一个快照,此后事务只能看到这个快照中的数据,即使在其他事务中有新的数据写入。写操作则会创建数据的新版本,旧版本对其他读取事务保持可见。

案例演示:MVCC的工作示例
  1. 事务A开始:读取表中id=1的员工数据,工资为5000。

    BEGIN TRANSACTION;
    SELECT salary FROM employees WHERE id = 1; -- 返回5000
    
  2. 事务B开始并更新数据事务B将id=1员工的工资增加到5500。

    BEGIN TRANSACTION;
    UPDATE employees SET salary = 5500 WHERE id = 1;
    COMMIT;
    
  3. 事务A再次读取事务A在执行期间,不会受到

事务B的修改影响,仍然读取快照中原始的工资5000。

SELECT salary FROM employees WHERE id = 1; -- 仍返回5000
  1. 事务A提交:当事务A提交后,任何新的读取将看到事务B更新后的值。
    COMMIT;
    

在这种模式下,读取操作不会阻塞写操作,且写操作的并发性能大大提升。MVCC避免了频繁的锁争用问题,提高了数据库的吞吐量。

3.3 MVCC的优缺点

优点:
  • 高并发性:读写操作不互相阻塞,能够处理大量并发请求。
  • 一致性视图:读操作可以看到一致的快照数据,保证数据一致性。
缺点:
  • 空间开销:因为需要存储数据的多个版本,可能会占用更多的存储空间。
  • 版本管理复杂:过多的版本可能导致数据膨胀,因此数据库需要定期清理无用的旧版本。

四、总结与下期预告

本期文章深入讲解了事务控制>事务控制和锁管理的核心概念。首先,我们探讨了不同的事务隔离级别及其对并发控制的影响,介绍了如何通过锁定机制来保障数据一致性,并分析了死锁问题及其解决方法。最后,我们详细介绍了多版本并发控制(MVCC)的原理,展示了其在高并发环境下的应用。

下期文章将聚焦【Oracle特有的SQL功能】,进一步了解Oracle独有的SQL扩展功能和高级特性,帮助大家充分利用Oracle数据库的强大能力。


http://www.niftyadmin.cn/n/5688270.html

相关文章

三、数据链路层(上)

目录 3.1数据链路层概述 3.1.1术语 3.1.2功能 3.2封装成帧和透明传输 3.2.1封装成帧 ①字符计数法 ②字符(节)填充法 ③零比特填充法 ④违规编码法 3.2.2透明传输 3.2.3差错控制 差错原因 检错编码 奇偶校验 ☆循环冗余码CRC 例题 纠错…

`git fetch` 检查更新

git fetch 是 Git 中的一个命令,主要用于从远程仓库获取最新的更新,但不会自动将这些更新合并到你的本地分支。它的主要作用是让你可以查看远程仓库的最新变化,而不改变你当前正在工作的代码。 1. 获取远程更新 git fetch 会从远程仓库下载…

python之with

with上下文管理是什么呢? 一般都是使用系统提供的一些with语句,列如我要去读取一些数据进行分析,就可以使用with open去读取某些数据,或者我要把一些图片给他保存到某些地方,可以用with给他写入。 上下午管理器with是…

DAY84服务攻防-端口协议桌面应用QQWPS 等 RCEhydra 口令猜解未授权检测

Day84:服务攻防-端口协议&桌面应用&QQ&WPS等RCE&hydra口令猜解&未授权检测_wps漏洞复现 rce-CSDN博客https://blog.csdn.net/qq_61553520/article/details/137119893?ops_request_misc%257B%2522request%255Fid%2522%253A%25220E34BCAF-166A-4…

《蓝桥杯算法入门》(C/C++、Java、Python三个版本)24年10月出版

推荐:《算法竞赛》,算法竞赛大全书,网购:京东 天猫  当当 文章目录 《蓝桥杯算法入门》内容简介本书读者对象作者简介联系与交流《蓝桥杯算法入门 C/C》版目录 《蓝桥杯算法入门 Java》版目录 《蓝桥杯算法入门 Python》版目录 …

scrapy爬取汽车、车评数据【上】

这个爬虫我想分三期来写: ✅ 第一期写如何爬取汽车的车型信息; ✅ 第二期写如何爬取汽车的车评; ✅ 第三期写如何对车评嵌入情感分析结果,以及用简单的方法把数据插入mysql中; 技术基于scrapy框架、BERT语言模型、mysq…

【Python】ftfy 使用指南:修复 Unicode 编码问题

ftfy(fixes text for you)是一个专为修复各种文本编码错误而设计的 Python 工具。它的主要目标是将损坏的 Unicode 文本恢复为正确的 Unicode 格式。ftfy 并非用于处理非 Unicode 编码,而是旨在修复因为编码不一致、解码错误或混合编码导致的…

CSS 圆形边框与阴影

目录 1. 圆角边框 1.1 正圆 1.2 圆角矩形 1.3 任意圆角 1.4 某个圆角 2. 盒子阴影 3. 文字阴影 1. 圆角边框 1.1 正圆 1.2 圆角矩形 1.3 任意圆角 1.4 某个圆角 2. 盒子阴影 3. 文字阴影