软考(软件设计师)数据库原理:事务管理,备份恢复,并发控制

数据库事务管理与备份恢复

事务(Transaction) 是数据库管理系统中执行的一个不可分割的工作单元,它包含一组 SQL 操作,这些操作要么全部成功执行,要么全部不执行。

事务的四大特性(ACID)

  • 原子性(Atomicity):事务中的所有操作要么全部提交成功,要么全部回滚失败
  • 一致性(Consistency):事务执行前后,数据库的完整性约束没有被破坏
  • 隔离性(Isolation):多个事务并发执行时,一个事务的执行不影响其他事务
  • 持久性(Durability):事务一旦提交,其结果永久保存在数据库中

一、事务管理:银行转账示例

1. ACID特性图解

开始事务
账户A扣款100元
账户B入账100元
转账成功?
提交事务
回滚事务
数据持久化
恢复原始状态

2. 事务控制代码解析

-- 银行转账事务示例
BEGIN TRANSACTION; -- 开启事务-- 账户1扣款
UPDATE accounts 
SET balance = balance - 100 
WHERE id = 1;-- 账户2入账
UPDATE accounts 
SET balance = balance + 100 
WHERE id = 2;-- 检查结果
IF (SELECT balance FROM accounts WHERE id = 1) >= 0COMMIT; -- 提交事务:所有操作永久生效PRINT '转账成功';
ELSEROLLBACK; -- 回滚事务:撤销所有操作PRINT '余额不足,转账失败';
END IF;

3. 隔离级别问题示例

脏读问题

-- 事务A(未提交)
BEGIN TRANSACTION;
UPDATE products SET stock = stock - 1 WHERE id = 100; -- 库存减1-- 事务B(读取未提交数据)
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT stock FROM products WHERE id = 100; -- 读取到99(未提交的值)-- 事务A回滚
ROLLBACK;-- 结果:事务B读取了不存在的数据

幻读(Phantom Read):一个事务在查询范围内插入了新数据,导致另一个事务两次查询结果不同

不可重复读问题

-- 事务A
BEGIN TRANSACTION;
SELECT price FROM products WHERE id = 200; -- 返回100-- 事务B
UPDATE products SET price = 120 WHERE id = 200;
COMMIT;-- 事务A再次查询
SELECT price FROM products WHERE id = 200; -- 返回120
COMMIT;

二、备份与恢复:电商数据库案例

数据库备份
物理备份
逻辑备份
冷备份
热备份
全量备份
增量备份
差异备份
高可用性与灾难恢复

高可用性架构

复制
复制
自动切换
客户端
负载均衡器
主数据库
从数据库1
从数据库2
监控系统

灾难恢复策略

  • 异地容灾:在地理位置不同的数据中心建立备份系统
  • 定期测试恢复流程:确保备份数据可用
  • 备份验证:定期还原备份数据进行验证
  • 日志传输:实时将事务日志传输到远程备份中心

1. 备份策略示例(SQL Server)

-- 周日:完全备份
BACKUP DATABASE EcommerceDB 
TO DISK = 'D:\Backup\Ecom_Full.bak'
WITH INIT, NAME = 'Full Backup';-- 周一至周六:差异备份
BACKUP DATABASE EcommerceDB 
TO DISK = 'D:\Backup\Ecom_Diff.bak'
WITH DIFFERENTIAL, NAME = 'Differential Backup';-- 每15分钟:事务日志备份
BACKUP LOG EcommerceDB 
TO DISK = 'D:\Backup\Ecom_Log.trn'
WITH NAME = 'Transaction Log Backup';

2. 恢复流程图示

User DBMS BackupFiles 启动恢复 获取完全备份 Ecom_Full.bak 恢复基础数据库结构 获取最新差异备份 Ecom_Diff.bak 应用最近更改 获取日志备份 Ecom_Log1.trn, Ecom_Log2.trn... 按顺序应用所有日志 数据库恢复完成 User DBMS BackupFiles

3. 时间点恢复示例

-- 恢复到7月8日14点的状态
RESTORE DATABASE EcommerceDB 
FROM DISK = 'D:\Backup\Ecom_Full.bak'
WITH NORECOVERY; RESTORE LOG EcommerceDB 
FROM DISK = 'D:\Backup\Ecom_Log.trn'
WITH STOPAT = '2025-07-08 14:00:00', RECOVERY;

恢复效果对比

数据库状态时间线:
7月8日12:00 ─── 14:00(故障点)─── 15:00恢复操作:
完全备份(12:00) + 日志备份(12:00-14:00) = 恢复到14:00状态

5. 高可用技术对比

同步复制
异步复制
日志传送
主数据库
备用数据库1
备用数据库2
备用数据库3

场景:在线商城订单处理

备份系统
事务管理
开始事务
数据变更
日志记录
备份订单数据
每小时差异备份
备份事务日志
每5分钟日志备份
扣减库存
用户下单
生成订单
记录日志
支付成功?
提交事务
回滚事务

三、数据库并发控制

一、为什么需要并发控制?

当多个用户同时访问数据库时,会出现经典问题:

并发操作
数据不一致
丢失更新
脏读
不可重复读
幻读
问题示例:银行账户并发访问
-- 事务A(转账)
BEGIN;
SELECT balance FROM accounts WHERE id = 1; -- 读到500
UPDATE accounts SET balance = 500 - 100 WHERE id = 1;-- 同时事务B(存款)
BEGIN;
SELECT balance FROM accounts WHERE id = 1; -- 也读到500
UPDATE accounts SET balance = 500 + 200 WHERE id = 1;
COMMIT;-- 事务A提交后:
-- 预期:500 - 100 + 200 = 600
-- 实际:500 + 200 = 700(丢失了-100的操作)

二、核心并发控制技术

并发控制技术分类
并发控制技术
锁机制
时间戳排序
多版本并发控制 MVCC
乐观并发控制
共享锁 S锁
排他锁 X锁
意向锁
行级锁
表级锁

三、锁机制详解

锁的类型

共享锁(Shared Lock, S 锁)

  • 允许其他事务读取同一资源

  • 多个事务可同时持有同一资源的共享锁

  • 语法示例(MySQL):

    SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE;
    

排他锁(Exclusive Lock, X 锁)

  • 禁止其他事务读取或修改同一资源

  • 同一资源上只能有一个排他锁

  • 语法示例(MySQL):

    SELECT * FROM table_name WHERE ... FOR UPDATE;
    
锁的粒度

表级锁

  • 对整张表加锁
  • 实现简单,开销小,但并发度低
  • 适用于批量操作(如 TRUNCATE、ALTER TABLE)

行级锁

  • 对表中特定行加锁
  • 并发度高,但实现复杂,开销大
  • 适用于高并发事务处理(如 OLTP 系统)

意向锁

  • 表示事务后续可能对表或行加锁
  • 分为意向共享锁(IS)和意向排他锁(IX)
  • 用于快速判断表中是否有行被锁定

锁表示例:

-- 事务A(获取排他锁)
BEGIN;
SELECT * FROM accounts WHERE id = 1 FOR UPDATE; -- X锁
UPDATE accounts SET balance = balance - 100 WHERE id = 1;-- 事务B(尝试读取)
SELECT balance FROM accounts WHERE id = 1; -- 被阻塞,等待锁释放
三级锁协议

三级锁协议是并发控制的基础框架,定义了事务在不同阶段如何获取和释放锁:

一级锁协议
防止丢失更新
二级锁协议
防止脏读
三级锁协议
防止不可重复读
一级锁协议(基本锁协议)
  • 核心规则:写数据前必须加排他锁(X 锁),事务结束才释放

  • 解决问题:丢失更新

  • 示例

    -- 事务A
    BEGIN;
    SELECT balance FROM accounts WHERE id = 1 FOR UPDATE; -- 获取X锁
    -- 此时事务B的更新请求会被阻塞
    UPDATE accounts SET balance = balance - 100 WHERE id = 1;
    COMMIT; -- 释放锁
    
二级锁协议(扩展锁协议)
  • 核心规则

    • 写数据前加X锁(事务结束释放)
    • 读数据前加共享锁(S 锁)(读完立即释放)
  • 解决问题:丢失更新 + 脏读

  • 示例

    -- 事务A
    BEGIN;
    SELECT balance FROM accounts WHERE id = 1 LOCK IN SHARE MODE; -- 获取S锁
    -- 其他事务可以读但不能写
    COMMIT; -- S锁在SELECT后立即释放-- 事务B
    BEGIN;
    SELECT * FROM accounts WHERE id = 1 FOR UPDATE; -- 获取X锁(阻塞直到A释放S锁)
    
三级锁协议(严格锁协议)
  • 核心规则

    • 写数据前加X锁(事务结束释放)
    • 读数据前加S锁(事务结束释放)
  • 解决问题:丢失更新 + 脏读 + 不可重复读

  • 示例

    -- 事务A
    BEGIN;
    SELECT balance FROM accounts WHERE id = 1 LOCK IN SHARE MODE; -- 获取S锁
    -- 此时事务B的更新会被阻塞
    SELECT balance FROM accounts WHERE id = 1; -- 第二次读取(结果相同)
    COMMIT; -- 释放S锁
    
三级锁协议对比
锁协议防止丢失更新防止脏读防止不可重复读锁释放时机
一级X 锁在事务结束释放
二级S 锁在读取后释放
三级S 锁和 X 锁在事务结束释放

死锁(Deadlock)

定义

  • 两个或多个事务互相等待对方释放锁资源,导致所有事务都无法继续执行的状态。

死锁示例

持有锁L1
持有锁L2
事务T1
等待锁L2
事务T2
等待锁L1

死锁产生的四个必要条件

  1. 互斥条件:资源不能被多个事务同时访问
  2. 占有并等待:事务持有锁的同时请求其他锁
  3. 不可抢占:锁只能由持有它的事务主动释放
  4. 循环等待:事务之间形成循环等待锁的链

死锁处理策略

  • 预防:破坏死锁产生的四个必要条件之一
  • 检测与恢复:DBMS 定期检测死锁,选择代价最小的事务回滚
  • 超时机制:事务等待锁超过一定时间后自动回滚

MySQL 死锁检测与处理

sql

-- 查看死锁日志
SHOW ENGINE INNODB STATUS;-- 设置死锁超时时间(默认50秒)
SET innodb_lock_wait_timeout = 10;-- 启用死锁检测(默认开启)
SET innodb_deadlock_detect = ON;

活锁(Livelock)

事务A 事务B 数据库 请求锁L(成功) 请求锁L(失败,等待) 释放锁L(临时回退) 请求锁L(成功) 重试请求锁L(失败,等待) 释放锁L(临时回退) 重试... 重试... loop [无限循环] 事务A 事务B 数据库

定义

  • 事务因不断收到锁请求被拒绝而无法继续执行的状态。

活锁示例

  • 事务 T1 持有锁 L,事务 T2 和 T3 循环请求锁 L
  • DBMS 采用公平锁策略,轮流授予 T2 和 T3 锁,但 T1 始终未释放锁
  • 导致 T2 和 T3 始终无法获取锁而陷入活锁

活锁处理策略

  • 先来先服务(FCFS):按请求锁的顺序授予锁
  • 随机后退:请求锁失败的事务随机等待一段时间后重试
  • 优先级机制:为事务分配优先级,高优先级事务优先获取锁
死锁与活锁对比
类型产生原因状态特征解决方法
死锁事务间循环等待锁所有事务停滞,无法继续执行死锁检测、超时机制、锁排序
活锁事务频繁被拒绝获取锁事务持续运行但无法完成公平锁策略、随机后退、优先级机制

死锁处理机制

死锁处理策略:

死锁检测
发现死锁?
选择牺牲者
回滚事务
释放锁资源
继续监控

现代并发控制优化

1. 乐观并发控制(OCC)

无冲突
有冲突
事务开始
读取数据
本地修改
提交验证
写入数据库
回滚重试

2. 多粒度锁定

数据库
表1
表2
行1-100
行101-200
行201-300

3. 索引并发控制(B+树示例)

         [根节点]/       \
[叶节点A]       [叶节点B]1│3│5           7│9│11插入操作:
1. 对根节点加S锁
2. 找到叶节点A,升级为X锁
3. 插入数据4
4. 释放所有锁

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

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

相关文章

【牛客刷题】相遇

文章目录 一、题目介绍1.1 题目描述1.2 输入描述1.3 输出描述1.4 示例二、解题思路2.1 核心算法设计2.2 性能优化关键2.3 算法流程图三、解法实现3.1 解法一:基础实现3.1.1 初级版本分析3.2 解法二:优化版本(推荐)3.2.1 优化版本分析一、题目介绍 1.1 题目描述 街道可以看…

uni-app 下拉搜索多选 支持自己创建数据

组件 /components/selectmul.vue <template><view class="multi-select-container"><view class="input-dropdown-container"><view class="" v-if="selectlist&&selectlist[0]"><text class=&qu…

nmon使用方法

安装方法 方法1&#xff1a; 最简单方法&#xff1a; #dnf install nom 验证 执行命令&#xff1a; #nmon 方法2&#xff1a; 下载安装包安装&#xff0c;下载地址 官网&#xff1a;nmon and njmon | Site / Download 或者&#xff1a;https://sourceforge.net/project…

Google AI 刚刚开源 MCP 数据库工具箱,让 AI 代理安全高效地查询数据库

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

数学建模的一般步骤

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 青春由磨砺而出彩&#xff0c;人生因奋…

【web安全】SQLMap 参数深度解析:--risk 与 --level 详解

目录 简介 一、--risk 参数&#xff1a;测试风险控制 1. 基本定义 2. 各级别详细对比 risk1 (默认) risk2 risk3 3. 使用建议 二、--level 参数&#xff1a;测试深度控制 1. 基本定义 2. 各级别详细对比 level1 (默认) level2 level3 level4 level5 3. 技术实…

YOLO在自动驾驶交通标志识别中的应用与优化【附代码】

文章目录YOLO在自动驾驶交通标志识别中的应用与优化引言1. YOLO算法概述1.1 YOLO的核心思想1.2 YOLO的演进2. 交通标志识别的挑战2.1 数据集特性2.2 性能指标要求3. YOLO模型优化策略3.1 数据增强改进3.2 注意力机制集成3.3 针对小目标的改进4. 完整实现示例4.1 模型训练代码4.…

开源鸿蒙(OpenHarmony)桌面版全面解析:架构适配、设备支持与开发实战

摘要:深度剖析OpenHarmony 4.0+桌面版的技术演进,揭秘其在X86/国产芯片设备的落地实践,附源码获取与开发板实战指南 一、OpenHarmony桌面版架构突破 1.1 跨平台内核适配 开源鸿蒙通过 多内核混合架构 实现全场景覆盖: X86架构:集成Linux内核适配层(kernel/linux),支持…

【WEB】Polar靶场 11-15题 详细笔记

目录 十一.爆破 PHP的基本语法 变量与常量 数据类型 流程控制 函数 文件操作 数据库交互 1.substr() 函数 2. intval() 函数 十二.XFF X-Forwarded-For&#xff08;简称XFF&#xff09; 十三.rce1 shell 命令分隔符 isset()函数 preg_match_all()函数 ${IFS}…

导诊系统的科室和症状词库如何扩展?

要扩展导诊系统的科室和症状词库&#xff0c;可以通过以下几种方式实现&#xff1a;1. 直接扩展科室定义&#xff08;推荐&#xff09;在初始化代码中直接添加新的科室及对应症状&#xff1a;# 扩展后的科室定义 depts [Department("内科", ["发热", &quo…

通过Prompt生成互动式网页HTML案例探索(二)

之前提到了一些【通过Claude 生成图片的prompt集锦&#xff08;一&#xff09;】&#xff0c;本篇沿着试着用prompt生成互动式网页 文章目录 1 什么是互动式网页&#xff1f;1.1 一个&#x1f330;1.1 核心能力列举1.3 部署方式 2 猜测秘塔AI搜索生成HTML的Prompt3 mozi大佬&am…

暑假读书笔记第四天

今日文章&#xff1a; 小林coding&#xff1a;什么是软中断&#xff1f; 目录软中断软中断概述软中断类型如何定位软中断 CPU 使用率过高的问题&#xff1f;其他: 往期打卡 软中断 中断是系统用来响应硬件设备请求的一种机制&#xff0c;操作系统收到硬件的中断请求&#xf…

跨平台的ARM 和 x86 Docker 镜像:汇编语言实验环境搭建

一、安装和配置 Docker 1.安装 Docker 官网链接&#xff1a;https://www.docker.com/ 以Debian(Ubuntu)系统为例: #安装依赖包 sudo apt-get update sudo apt-get install -y ca-certificates curl gnupg lsb-release#添加 Docker 官方 GPG 密钥 sudo mkdir -p /etc/apt/keyr…

【前端知识】HTML页面渲染:底层原理与技术实现剖析

HTML页面渲染&#xff1a;底层原理与技术实现剖析HTML页面渲染&#xff1a;底层原理与技术实现剖析渲染引擎的核心工作流程深度解析渲染关键阶段1. 解析与构建DOM&#xff08;Document Object Model&#xff09;2. 构建CSSOM&#xff08;CSS Object Model&#xff09;3. 渲染树…

Catmull-Rom平滑多段线在奇异点处的扭曲问题(1)

Catmull-Rom在奇异点处的扭曲问题 引言 在计算机图形学和动画中&#xff0c;我们经常需要在已知点之间创建平滑的过渡。Catmull-Rom样条是一种流行的插值方法&#xff0c;它以简单直观的方式生成经过所有控制点的平滑曲线。本文将深入探讨Catmull-Rom插值的原理、实现和应用。…

SX8652IWLTRT Semtech升特超低功耗触控芯片 12通道+I²C接口 重新定义人机交互!

SX8652IWLTRT&#xff08;Semtech&#xff09;产品解析与推广文案一、产品定位SX8652IWLTRT是Semtech&#xff08;升特半导体&#xff09;推出的低功耗电容式触摸控制器&#xff0c;采用IC接口&#xff0c;专为便携式设备和小家电的触摸交互设计&#xff0c;支持多点触控和手势…

第02章 MySQL环境搭建

1.MySQL的卸载 步骤1&#xff1a;停止MySQL服务 在卸载之前&#xff0c;先停止MySQL8.0的服务。按键盘上的“Ctrl Alt Delete”组合键&#xff0c;打开“任务管理器”对话框&#xff0c;可以在“服务”列表找到“MySQL8.0”的服务&#xff0c;如果现在“正在运行”状态&#…

实战Linux进程状态观察:R、S、D、T、Z状态详解与实验模拟

前言 在Linux系统中&#xff0c;进程状态是系统管理和性能调优的核心知识。一个进程从诞生到终止&#xff0c;会经历运行&#xff08;R&#xff09;、可中断睡眠&#xff08;S&#xff09;、不可中断睡眠&#xff08;D&#xff09;、停止&#xff08;T&#xff09;、僵尸&#…

数据库与关系数据库的区别是什么

数据库&#xff0c;简单来说&#xff0c;就是一个存储数据的地方&#xff0c;就像一个超级大仓库&#xff0c;能把各种各样的数据都收纳进来。它可以是一个简单的文本文件&#xff0c;用来记录一些基本信息&#xff1b;也可以是一个复杂的系统&#xff0c;存储着企业的大量业务…

如何解决微信小程序出现两个下拉刷新样式?

在微信小程序中&#xff0c;如果出现两个下拉刷新的情况&#xff0c;可能是因为在多个地方启用了下拉刷新功能&#xff0c;或者在同一个页面中多次调用了下拉刷新的API。以下是一些可能的原因和解决方法&#xff1a; 多次调用下拉刷新API&#xff1a; 确保在页面的生命周期中只…