数据库原理及应用·数据库保护

news2025/2/5 7:51:45

7.1 事务

7.1.1 事务定义

1.事务是用户定义的一个数据操作序列,这些操作要么全部执行、要么全部不执行,是一个不可分割的工作单元。

事务是恢复和并发控制的基本单位

事务的两种方式:

7.1.2 事务处理模型

1.ISO事务处理模型:
明尾暗头――事务的开头是隐含的,事务的结束有明确标记  
事务起始位置:程序的首条SQL语句或事务结束符后的第一条语句。  
事务结束符:
COMMIT:事务成功结束符,
ROLLBACK:事务失败结束符,              
事务终止位置:
在程序正常结束处或COMMIT语句处成功终止;
在程序出错处或或ROLLBACK处失败终止。

UPDATE 支付表 
    SET 帐户总额 = 帐户总额 - n
	WHERE 帐户名 = ‘A’
UPDATE 支付表 
    SET 帐户总额 = 帐户总额 + n
	WHERE 帐户名 = ‘B’
COMMIT

2.T-SQL事务处理模型:
每个事务都有显式的开始和结束标记。
事务的开始标记是:

​​​​​​​BEGIN TRANSACTION | TRAN

事务的结束标记为:

COMMIT [TRANSACTION|TRAN]
ROLLBACK [TRANSACTION|TRAN]
BEGIN TRANSACTION 
UPDATE 支付表 SET 帐户总额 = 帐户总额-n
              WHERE 帐户名 = ‘A’
UPDATE 支付表 SET 帐户总额 = 帐户总额+n
		WHERE 帐户名 = ‘B’
COMMIT

7.1.3 事务的特性:ACID

 

原子性:事务是一个完整的操作; 对于其数据修改,要么全都执行,要么全都不执行。

一致性:事务在完成时,必须使所有的数据都保持一致状态。

隔离性:对数据进行修改的所有并发事务是彼此隔离的。

持久性:事务完成之后,它对于系统的影响是永久性的。即使出现故障也将一直保持。

保证事务的ACID特性是事务处理的重要任务。

事务的ACID特性可能遭到破坏的因素有:
多个事务并行运行时,不同事务的操作有交叉情况。(并发控制)
事务在运行过程中被强迫停止。(数据恢复)

7.2 并发操作引发的问题

7.2.1  并发控制

数据库系统的一个主要特点是多用户共享数据库资源。

若对多用户的并发操作不加控制,就会造成数据存、取的错误,破坏数据的一致性和完整性。

7.2.2 并发操作引发的问题

1.丢失数据修改:指事务T1与事务T2从数据库中读入同一数据并修改,事务T2的提交结果破坏了事务T1提交的结果,导致事务T1的修改被丢失。

2.读“脏”数据:事务T1修改后的数据值被事务T2读取,然后T1由于某种原因被撤销,其修改的数据值也恢复原值,于是T2读到的数据值与数据库中的数据值不一致,称为读“脏”数据。

3.不可重复读:指事务Tl从数据库读取某些数据后,事务T2对其进行了修改(也可能是删除或插入),当事务T1再次读取该数据时,得到与上次不一致的值。

产生上述数据不一致现象的主要原因就是并发操作破坏了事务的隔离性

7.3 基本封锁类型

7.3.1 并发控制措施

控制目标:事务运行过程中尽可能隔离事务外操作对本事务数据环境的影响。

在数据库环境下,并发控制的主要方式是封锁机制,即加锁(Locking)。

所谓封锁,就是指事务在对某个数据对象进行操作之前,先要对其申请加锁。加锁成功后,即对该数据对象具有一定的控制权。

排它锁(X):又称写锁,一旦一事务获得了对某一数据的排它锁,则任何其他事务再不能对该数据加任何类型的锁。其他事务只能进入等待状态,直到第一个事务撤销了对该数据的封锁。

共享锁(S):又称读锁,指对于读操作(检索)来说,可以多个事务同时获得共享锁,但阻止其他事务对已获得共享锁的数据进行排它封锁。

7.3.2 排它锁和共享锁的控制方式

7.4 封锁协议

7.4.1 一级封锁协议

封锁协议:在运用X锁和S锁对数据对象进行加锁时,还需要约定一些规则,如何时申请X锁或S锁、持锁时间、何时释放锁等,这些规则为封锁协议或加锁协议(Locking Protocol)。

对封锁方式规定不同的规则,就形成了各种不同级别的封锁协议。 不同级别的封锁协议达到的系统一致性级别不同。

对事务T要修改的数据加X锁,直到事务结束(包括正常结束和非正常结束)时才释放

一级封锁协议可以防止丢失修改,并保证事务T是可恢复的

不能保证不读“脏数据” ;不能保证可重复读

7.4.2 二级封锁协议

二级封锁协议:一级封锁协议加上对事务T对要读取的数据加S锁,读完后即释放S锁。

7.4.3 三级封锁协议

一级封锁协议加上事务T对要读取的数据加S锁,并直到事务结束才释放

除了可以防止丢失修改不读“脏”数据之外,还进一步防止了不可重复读

7.4.4 不同级别的封锁协议总结

7.5 死锁

两个事务相互等待对方先释放资源,则会造成死锁。

     

7.5.1 预防死锁的方法

1.一次封锁法:每个事务一次将所有要使用的数据全部加锁。

会降低系统并发度

2. 顺序封锁法:预先对数据对象规定一个封锁顺序,所有事务都按这个顺序封锁 。

维护数据对象的封锁顺序成本很高

很难事先确定每个事务的所有封锁对象

多采用诊断并解除死锁的方法

7.5.2  死锁的诊断与解除

诊断:超时法、事务等待图法

解除:撤销处理代价最小的事务

7.6 并发调度的可串行性

若事务是顺序执行的,则称这种执行方式为串行执行。

若多个事务可以同时被数据库管理系统接受,在时间上重叠执行,则称这种执行方式为并发执行。

多个事务的并发执行是正确的,当且仅当其结果与按某一顺序的串行执行的结果相同,则我们称这种调度为可串行化的调度。

可串行性是并发事务正确性的准则。

设有两个事务,分别包含下列操作:

事务T1:读B;A=B+1;写回A

事务T2:读A;B=A+1;写回B

设A、B的初值均为4,给出对这两个事务不同的调度策略。

策略1:串行调度

策略2:并发调度

不可串行化
可串行化

7.7 两段锁协议

两段锁协议是指所有的事务分为两个阶段:

申请封锁期(也称扩展阶段):申请要进行的封锁。

释放封锁期(也称收缩阶段):释放所占有的封锁。

申请期不允许释放任何锁,在释放期不允许申请任何锁,这就是两段式封锁。

--事务1的封锁序列
Slock A ... Slock B ... Xlock C …Unlock B ... Unlock A ... Unlock C;

--事务2的封锁序列
Slock A ...Unlock A ...Slock B ...Xlock C... 
Unlock C …Unlock B;

若并发执行的所有事务都遵守两段锁协议,则这些事务的任何并发调度策略都是可串行化的。

若并发事务的一个调度是可串行化的,不一定所有事务都符合两段锁协议。

所有遵守两段锁协议的事务,其并行执行的结果一定是正确的

两段锁协议与防止死锁的一次封锁法:

一次封锁法要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行,因此一次封锁法遵守两段锁协议

但是两段锁协议并不要求事务必须一次将所有要使用的数据全部加锁,因此遵守两段锁协议的事务可能发生死锁

遵守两段锁协议的事务发生死锁:

两段锁协议与三级封锁协议:

两类不同目的的协议
两段锁协议:保证并发调度的正确性
三级封锁协议:在不同程度上保证数据一致性

遵守第三级封锁协议必然遵守两段锁协议

7.8  数据库故障类型

数据恢复:数据库中的数据无法保证绝对不遭受破坏,因此系统必须具有检测故障并把数据从错误状态恢复到某一正确状态的功能,这就是数据库的恢复。

数据库故障类型:事务内部故障、系统故障、介质故障、计算机病毒

7.8.1 事务故障

事务故障又可分为两种:

① 可以预期的事务故障:即在程序中可以预先估计到的错误 可以在事务的代码中加入判断和ROLLBACK语句。当事务执行到ROLLBACK语句时,由系统对事务进行回退操作,即执行UNDO(撤消)操作

② 非预期的事务故障:即在程序中发生未估计到的错误 事务没有达到预期的终点(提交或回滚),数据库可能处于不正确状态。 此时由系统直接对该事务执行UNDO处理

银行转帐事务,把一笔金额从帐户A转移到帐户B,如果帐户A的存款不够转帐的金额,该事务就必须撤消。

BEGIN TRANSACTION
SELECT BALANCE FROM ACCOUNTS WHERE ACCOUNT_NO = A
BALANCE_A = BALANCE (读取帐户A的余额BALANCE_A)
BALANCE_A = BALANCE_A - AMOUNT;(AMOUNT为转帐金额)
IF ( BALANCE_A<0 ) THEN
    { 打印‘金额不足,不能转帐’;
    ROLLBACK;(撤销该事务)}
ELSE  ……

7.8.2 系统故障、介质故障、计算机病毒

1.系统故障:指造成系统停止运转、系统要重启的故障。例如,特定硬件错误(CPU故障)、操作系统故障、突然停电等。 影响所有正在运行的事务,但不破坏数据库。

3.介质故障:将破坏数据库,并影响正在存取这部分数据的所有事务。

4.计算机病毒:破坏性很大,极易传播。

7.9 数据转储与日志

7.9.1 数据库恢复基本原理与技术

基本原理就是“冗余”,即数据库重复存储。

恢复机制涉及到两个关键问题: 如何建立冗余数据;如何利用这些冗余数据实施数据库恢复

建立冗余数据最常用的技术是:

数据转储:DBA定期地将整个数据库复制到磁带或另一个磁盘上保存起来的过程。这些备用的数据文本称为后备副本或后援副本。

转储方法:静态转储与动态转储;海量转储与增量转储

登录日志文件:日志文件是用来记录事务对数据库的更新操作的文件。

数据转储是数据库恢复中采用的基本技术。

通常在一个数据库系统中,两种方法是一起使用的。

7.9.2 静态转储

在系统中无运行事务时进行转储

转储开始时数据库处于一致性状态

转储期间不允许对数据库的任何存取、修改活动

优点:实现简单

缺点:降低了数据库的可用性、转储必须等用户事务结束、新的事务必须等转储结束

7.9.3 动态转储

利用动态转储得到的副本进行故障恢复

需要把动态转储期间各事务对数据库的修改活动登记下来,建立日志文件

后备副本加上日志文件才能把数据库恢复到某一时刻的正确状态

7.9.4 海量转储与增量转储

海量转储: 每次转储全部数据库

增量转储: 只转储上次转储后更新过的数据

海量转储与增量转储比较:
从恢复角度看,使用海量转储得到的后备副本进行恢复往往更方便
但如果数据库很大,事务处理又十分频繁,则增量转储方式更实用更有效

7.9.5 转储策略

应定期进行数据转储,制作后备副本。

但转储又是十分耗费时间和资源的,不能频繁进行。

DBA应该根据数据库使用情况确定适当的转储周期和转储方法。

例: 每天晚上进行动态增量转储;每周进行一次动态海量转储;每月进行一次静态海量转储。

7.9.6 登记日志文件(Logging)

日志文件是用来记录事务对数据库的更新操作的文件。

日志文件主要有两种格式: 以记录为单位的日志文件;以数据块为单位的日志文件

日志记录(log record)的内容:

日志文件的用途

日志文件的用途:①事务故障的恢复 ②系统故障的恢复 ③介质故障的恢复

具体作用:
(1) 事务故障的恢复和系统故障的恢复必须使用日志文件
(2) 在动态转储方式中必须建立日志文件,后援副本和日志文件结合才能有效地恢复数据库
​​​​​​(3) 在静态转储方式中也可以建立日志文件

7.10 数据恢复策略

7.10.1 事务故障的恢复

事务故障:事务在运行至正常终止点前被中止

恢复方法:由恢复子系统应利用日志文件撤消(UNDO)此事务已对数据库进行的修改

事务故障的恢复由系统自动完成,不需要用户干预

事务故障的恢复步骤:

①反向扫描文件日志(即从最后向前扫描日志文件),查找该事务的更新操作。

②对该事务的更新操作执行逆操作。即将日志记录中“更新前的值”(Befor Image, BI)写入数据库。

(插入---删除; 删除---插入; 修改---修改前的值取代修改后的值) 即将日志记录中“更新前的旧值”写入DB。

③继续反向扫描日志文件,查找该事务的其他更新操作,并做同样处理。

④如此处理下去,直至读到此事务的开始标记,事务故障恢复就完成了。

7.10.2 系统故障的恢复

系统故障造成数据库不一致状态的原因:
一些未完成事务对数据库的更新已写入数据库
一些已提交事务对数据库的更新还留在缓冲区没来得及写入数据库

恢复方法
1.Undo 故障发生时未完成的事务
2.Redo 已完成的事务

系统故障的恢复由系统在重新启动时自动完成,不需要用户干预

系统故障的恢复步骤:

1. 正向扫描日志文件(即从头扫描日志文件)
Redo队列: 在故障发生前已经提交的事务
T1,  T3, T8…..
Undo队列:故障发生时尚未完成的事务
​​​​​​​T2,  T4, T5, T6, T7, T9  …...

2. 对Undo队列事务进行UNDO处理 
反向扫描日志文件,对每个UNDO事务的更新操作执行逆操作
T2, T4, T5, T6, T7, T9  ……

3. 对Redo队列事务进行REDO处理
正向扫描日志文件,对每个REDO事务重新  执行登记的操作
T1,  T3, T8…..

7.10.3 介质故障的恢复

最严重的故障, 磁盘上的物理数据和日志文件被破坏

恢复方法:重装DB后援副本,重做已完成的事务

介质故障的恢复由DBA重装DB副本和日志文件副本,然后执行系统提供的恢复命令,由系统执行恢复。

恢复步骤:

1. 装入最新的后备数据库副本,使数据库恢复到最近一次转储时的一致性状态。
对于静态转储的数据库副本,装入后数据库即处于一致性状态
对于动态转储的数据库副本,还须同时装入转储时刻的日志文件副本,利用与恢复系统故障相同的方法(即REDO+UNDO),才能将数据库恢复到一致性状态。

2. 装入有关的日志文件副本,重做已完成的事务。

首先扫描日志文件,找出故障发生时已提交的事务的标识,将其记入重做队列。
然后正向扫描日志文件,对重做队列中的所有事务进行重做处理。即将日志记录中“更新后的值”写入数据库。

介质故障的恢复需要DBA介入

DBA的工作:
重装最近转储的数据库副本和有关的各日志文件副本
执行系统提供的恢复命令

具体的恢复操作仍由DBMS完成

7.10.4 登记日志文件的原则

为保证数据库是可恢复的,登记日志文件时必须遵循两条原则:
登记的次序严格按并行事务执行的时间次序
必须先写日志文件,后写数据库

写日志文件操作:把表示这个修改的日志记录写到日志文件

写数据库操作:把对数据的修改写到数据库中

为什么要先写日志文件:
写数据库和写日志文件是两个不同的操作
在这两个操作之间可能发生故障
如果先写了数据库修改,而在日志文件中没有登记下这个修改,则以后就无法恢复这个修改了
​​​​​​​如果先写日志,但没有修改数据库,按日志文件恢复时只不过是多执行一次不必要的UNDO操作,并不会影响数据库的正确性

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

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

相关文章

隐私第一:在几分钟内部署本地大语言模型!

彻底改变您的数据安全游戏&#xff1a;快速无缝部署本地大语言模型&#xff0c;实现无与伦比的隐私! 2023年是人工智能领域加速发展的一年。除了健壮的商业上可用的大型语言模型之外&#xff0c;还出现了许多值得称赞的开源方案&#xff0c;例如Llama2、Codellama、Mistral和Vi…

鸿蒙开发中的坑(持续更新……)

最近在使用鸿蒙开发时&#xff0c;碰到了一些坑&#xff0c;特做记录&#xff0c;如&#xff1a;鸿蒙的preview不能预览&#xff0c;轮播图组件Swiper使用时的问题&#xff0c;console.log() 打印的内容 一、鸿蒙的preview不能预览 首先&#xff0c;只有 ets文件才能预览。 其…

HarmonyOS应用抓包实战

Charles抓包原理 Charles是一个HTTP代理服务器,HTTP监视器,反转代理服务器&#xff0c;当浏览器连接Charles的代理访问互联网时&#xff0c;Charles可以监控浏览器发送和接收的所有数据。 在开发OpenHarmony/HarmonyOS应用开发时&#xff0c;我们使用的是ohos/axios来进行网络…

2023.12.25 关于 Redis 数据类型 Hash 常用命令、内部编码、应用场景

目录 Hash 数据类型 Hash 操作命令 HSET HGET HEXISTS HDEL HKEYS HVALS HGETALL HMGET HLEN HSETNX HINCRBY HINCRBYFLOAT HSTRLEN Hash 编码方式 理解什么是压缩 Hash 实际应用 Cache 缓存 Hash 数据类型 整体上来说 Redis 是键值对结构&#xff0c;其中 …

基于JSP+Servlet+Mysql的学生宿舍管理系统(简单的增删改查)

基于JSPServletMysql的学生宿舍管理系统 一、系统介绍二、功能展示1.登陆、注册2.主页3.增加3.修改4.删除 四、其它1.其他系统实现五.获取源码 一、系统介绍 项目名称&#xff1a;基于JSPServletMysql的学生宿舍管理系统(简单的增删改查) 项目架构&#xff1a;B/S架构 开发语…

电视盒子什么品牌好?经销商分享线下热销电视盒子排行榜

做实体数码店已经超过六年了&#xff0c;我对电视盒子这行是非常了解的&#xff0c;品牌的优势和特色都有研究&#xff0c;超级多网友在讨论电视盒子什么品牌好&#xff0c;我整理了店铺内销量最高的电视盒子排行榜&#xff0c;想知道目前哪些电视盒子最受消费者欢迎&#xff0…

真实案例扫描APP开发——基于实例分割实现拍照文档实时边缘检测(C++/JNI实现)

前言 这是一个安卓NDK的项目&#xff0c;想要实现的效果就是拍照扫描&#xff0c;这里只涉及到的只有边缘检测&#xff0c;之后会写文档滤镜、证件识别与证件1比1打印&#xff0c;OCR、版面分析之后的文档还原。我的开发环境是Android Studio 北极狐&#xff0c;真机是华为mat…

详解Keras3.0 Layer API: LSTM layer

LSTM layer 用于实现长短时记忆网络&#xff0c;它的主要作用是对序列数据进行建模和预测。 遗忘门&#xff08;Forget Gate&#xff09;&#xff1a;根据当前输入和上一个时间步的隐藏状态&#xff0c;计算遗忘门的值。遗忘门的作用是控制哪些信息应该被遗忘&#xff0c;哪些…

最新版手机无人直播硬改虚拟摄像头,支持多平台修改手机摄像头【硬改神器+使用教程】

最新版手机无人直播助手App安卓版介绍&#xff1a; 顺哥轻创V:shundazy1 这是一款兼容性强大的手机无人直播工具&#xff0c;是无人直播神器&#xff0c;不依赖电脑&#xff0c;手机无需root权限&#xff0c;不需要装xp框架&#xff0c;支持主流平台兼容性极佳&#xff0c;1V…

BEECMS靶场 -->漏洞挖掘

这几天&#xff0c;一天一个靶场&#xff08;累鼠我啦&#xff09;&#xff0c;哈哈哈&#xff0c;也算是积累了不少经验&#xff0c;今天&#xff0c;我们就来讲一下BEECMS靶场吧&#xff01;&#xff01;&#xff01; 先是直接进入到他的界面…

MySQL——进阶篇

二、进阶篇&#x1f6a9; 1. 存储引擎&#x1f346; 1.1 MSQL体系结构 连接层&#xff1a; 连接处理&#xff0c;连接认证&#xff0c;每个客户端的权限 服务层&#xff1a; 绝大部分核心功能&#xff0c;可跨存储引擎 可插拔存储引擎&#xff1a; 需要的时候可以添加或拔掉…

【Vue】computed详解

✨ 专栏介绍 在当今Web开发领域中&#xff0c;构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架&#xff0c;正是为了满足这些需求而诞生。它采用了MVVM架构模式&#xff0c;并通过数据驱动和组件化的方式&#xff0c;使…

实习课知识整理3:首页商品列表的展示

对于一个购物商城的项目&#xff0c;主体还得是商品&#xff0c;这篇博客主要介绍如何将数据库中的信息渲染到页面上&#xff0c;这边后端是SpringBoot,前端是html配合thymeleaf模板 1. 编写查询数据库的方法 在这边我在页面上需要两部分的信息&#xff0c;一个是所有的商品&am…

1233. 全球变暖(bfs宽搜相邻点)

题目&#xff1a; 1233. 全球变暖 - AcWing题库 思路&#xff1a;bfs 1.临接问题&#xff0c;最短路径问题--->bfs。 2.被完全淹没--->岛屿所以部分均临海。 代码&#xff1a; #include<bits/stdc.h> using namespace std; const int N1010; struct Point …

Leetcode---376周赛---中位数贪心

题目列表 2965. 找出缺失和重复的数字 2966. 划分数组并满足最大差限制 2967. 使数组成为等数数组的最小代价 2968. 执行操作使频率分数最大 一、找到缺失和重复的数字 由于数据范围不是很大&#xff0c;可以直接暴力统计每个数字出现的次数&#xff0c;时间复杂度为O(n^2…

Linux系统--账号和权限管理

目录 一、Linux安全模型 二、用户账号和组账号 2.1 用户帐号类型 2.2 组账号 2.3 用户和组的关系 三、两个重要文件夹 3.1 用户账号文件/etc/passwd 3.2 /etc/shadow 四、用户命令 4.1 useradd命令——添加用户 4.2 passwd命令——密码管理 4.3 usermod命令—…

【OO ALV实现合并行和列】

需求场景 做了一个FUNCTION ALV&#xff0c;按行展示&#xff0c;但是用户需要做一个转置&#xff0c;前面列按行显示&#xff0c;后面数量列由按列显示调整为按行显示。查了一下&#xff0c;好像是FUNCTION ALV实现不了&#xff0c;参考了一位博主实现了这个需求。 ABAP ALV多…

运维工程师的出路到底在哪里?—— 浅谈运维工程师前景

目录 前言 一、运维工程师的职责 二、能力要求 &#xff08;一&#xff09;技术方面 &#xff08;二&#xff09;管理方面 &#xff08;三&#xff09;业务方面 三、35岁被称为运维半衰期&#xff0c;究竟为何&#xff1f; 四、该如何顺利过渡半衰期 五、运维的职业发…

(更新)上市公司研发与创新补助数据合集(2007-2022年)

数据简介&#xff1a; 数据来源&#xff1a;原始数据来源于上市公司年报时间跨度&#xff1a;2008-2022年数据范围&#xff1a;3400家上市企业数据展示&#xff1a; 初始数据&#xff1a; Stkcdyear说明金额0000042008政府补助利得644000000052008合计644000000062009政府补…

Zookeeper在分布式命名服务中的实践

Java学习面试指南&#xff1a;https://javaxiaobear.cn 命名服务是为系统中的资源提供标识能力。ZooKeeper的命名服务主要是利用ZooKeeper节点的树形分层结构和子节点的顺序维护能力&#xff0c;来为分布式系统中的资源命名。 哪些应用场景需要用到分布式命名服务呢&#xff1…