数据库讲解---(数据库保护)【下】

news2024/11/28 2:53:18

目录

一.并发控制

1.1并发操作引发的问题

1.1.1丢失修改

1.1.2不可重复读

1.1.3读”脏“数据

1.2调度及其可串行化

1.3事务的隔离性级别

1.4封锁技术【重要】

1.4.1排他锁

1.4.2共享锁

1.5封锁协议

1.5.1一级封锁协议

1.5.2二级封锁协议

1.5.3三级封锁协议

1.5.4两段锁协议

1.6死锁与活锁问题

1.6.1死锁

1.6.2活锁

1.7封锁的粒度

二.数据库安全性

2.1用户标识与鉴别

2.2存取控制

2.3视图机制

2.4数据加密

2.5审计

三.数据库完整性

3.1完整性约束条件的类型

3.1.1静态约束

3.1.2动态约束

3.2完整性控制机制的功能

3.2.1定义功能

3.2.2检查功能

3.2.3保护功能

3.3完整性约束的表达方式

3.3.1在创建和修改基表模式时说明约束

SQL中的关键字

参照完整性和外部关键字

属性值的约束

全局约束

3.4用断言说明约束【了解即可】

3.5用过程说明约束

一.并发控制

作为共享资源的数据库,可以同时供很多用户使用。

在这样的系统中,同一时刻需要运行很多个事务,如何高效一致地执行这些事务是并发控制的工作。

当允许多个事务并发存取数据库时,如果不加以控制就有可能导致并发事务相互干扰,存取到不正确的数据,破坏数据库的一致性。

1.1并发操作引发的问题

在并发存取环境下,如果不同事务的两个操作均针对同一数据对象,且至少有一个是写操作,则称这两个操作是“冲突”的。

若对并发事务中的冲突操作不加控制,可能引发三类问题:“丢失修改”、“不可重复读”、“读脏数据

1.1.1丢失修改

两个事务T1和T2先后对同一数据对象A进行修改并写入数据库时,后写入的结果会覆盖掉先写入的结果导致先写入的事务修改结果丢失,即丢失修改问题

丢失修改问题是由“写-写”冲突引起

1.1.2不可重复读

一个事务如果没有执行任何更新数据库数据的操作,则它们同一个查询操作执行两次或多次,结果应该是一致的如果不一致,就说明产生了“不可重复读”。

例如:“事务T1连续两次读入数据A,事务T2在事务T1连续读入数据A的间隙,修改了数据A,造成事务T1两次读取的数据A结果不一致”。

不可重复读是由“读-写”冲突引起的。

1.1.3读”脏“数据

读“脏”数据,简称脏读,是指一个事务读取了另一个未提交的事务中的数据

读“脏”数据是由“写-读”冲突引起的

1.2调度及其可串行化

在并发访问情况下,当有多个事务并发执行时,其操作交叉执行的次序有很多种可能,因此需要有一个衡量并发调度正确与否的判断准则。

1.3事务的隔离性级别

SQL标准定义了4种标准隔离级别从低到高依次为:“读未提交”、“读已提交”、”可重复读“、”可串行化“。

  • 读未提交:最低的隔离级别,在这种事务隔离级别下,一个事务可以读到另外一个事务未提交的数据,不允许丢失修改,接收读脏数据和不可重复读现象。
  • 读已提交:若事务还没提交,其他事物不能读取该事务正在修改的数据。不允许丢失修改和读脏数据,接受不可重复读现象。
  • 可重复读:失误多次读取统一数据对象的结果一致,不允许丢失修改、读脏数据、读不一致、接受幻影读现象。
  • 可串行化:最高级别的隔离性,保证可串行化,不允许丢失修改、读脏数据、读不一致以及幻影读现象的发生。

1.4封锁技术【重要

封锁是实现并发控制的一种机制

所谓封锁就是事务T在对某个数据对象操作之前先对其加锁加锁后事务T就对该数据对象有一定程度的独占控制,在实物T释放锁之前,其它事务在操作数据对象时将会被拒绝

基本的封锁类型有:“排他锁”、“共享锁”两种。

1.4.1排他锁

排他锁,也称为X锁或者写锁

事务T对数据对象A加上X锁,则在加锁期间只允许T对数据对象A进行读取和修改

1.4.2共享锁

共享锁,也称为S锁读锁

事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事物只能再对A加S锁,而不能加X锁,直到A上的S锁全部被释放

排他锁共享锁封锁控制方式可以用下表表示:

其中:

  • NL表示无锁
  • X表示写锁
  • S表示读锁
  • T1/T2表示事务

1.5封锁协议

在运用X锁S锁对数据对象加锁时,还需要约定一些规则,例如,何时申请X锁或S锁、持锁时间、何时释放等,这些规则称为“封锁协议”。

针对“读未提交”、“读已提交”、“可重复读”、“可串行化四种事务隔离级别,可以通过下面的三级封锁协议两段锁协议来实现。

1.5.1一级封锁协议

一级封锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。

事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK)

一级封锁协议只能解决“丢失修改”问题

1.5.2二级封锁协议

一级封锁协议的基础上,再加上事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁

二级封锁协议解决:“丢失修改”、“读脏数据

1.5.3三级封锁协议

一级封锁协议的基础上,再加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放

三级封锁协议解决:“丢失修改”、“读脏数据”、“不可重复读

上面的三级封锁协议,不能解决“插入和删除的幻影读现象

1.5.4两段锁协议

两段锁协议(2PL协议),是一种能够实现并发调度可串行化的封锁协议

  • 在任何数据对象进行读、写操作之前,事务要获得对数据对象的加锁。
  • 在释放任意一个锁之后,事务不再允许获得任何其他加锁。

 

在遵守两段锁协议事务中,明显地可分为两个阶段第一阶段是锁逐步增加阶段,称为扩展阶段。第二阶段是锁逐步释放阶段,称为收缩阶段

如果遵守2PL的调度,将锁释放都放在事务结束,则可避免发生连锁回滚不可重复读问题

把所有锁都放在事务结束时释放的两段锁协议称为严格的2PL协议”,大多数DBMS都采用严格的2PL

1.6死锁与活锁问题

1.6.1死锁

如果系统中有两个两个以上的事务都处于等待状态,并且每个事务都在等待其中另一个事务解除封锁,它才能够继续执行下去,结果造成任何一个事务都无法继续执行,这种现象称为系统进入了“死锁”。

在数据库系统中死锁很少发生,即使发生也涉及很少几个事务。

死锁检测的方法一般有下列两种:

  • 超时法:如果一个事务的等待时间超过某个时限,则认为发生死锁
  • 等待图法:动态维护一个等待图,如果等待图中出现回路,则存在死锁

1.6.2活锁

系统可能使某个事务永远处于等待状态,得不到封锁的机会,这种现象称为系统进入了“活锁”。

解决活锁的方法

  • 先来先服务策略,封锁子系统对请求封锁的先后次序进行排队,以此获得锁

1.7封锁的粒度

在数据库中,封锁的数据对象可以是:“逻辑单元”(属性、属性集、元组、关系、索引项、整个索引、整个数据库),也可以是物理单元,例如:“页、块、存储区域”等。

封锁数据对象大小称为“封锁的粒度”。

封锁粒度越大,封锁处理越简单,系统开销也越小,但这样往往把无需加锁的数据也封锁了,反之

二.数据库安全性

数据库系统通常采取的安全措施包括:“用户标识与鉴别”、“存取控制”、“视图机制”、“数据加密”、“审计”。

2.1用户标识与鉴别

用户标识与鉴别是系统提供的最外层安全保护措施。

即使用“用户名+密码”的方式来登录数据库才可以进行操作

2.2存取控制

存取控制是确保具有授权资格的用户访问数据库,同时使所有未被授权的人员无法访问数据库的机制

数据库用户按照访问权利的大小,可以分为三类

  1. 一般数据库用户:通过授权可以对数据库进行操作的用户
  2. 数据库的拥有者:数据库的拥有者即数据库的创建者,除了一般数据库用户的权利外,还可以授予或收回其他用户对其所创建数据库的存取权。
  3. 有DBA特权的用户:拥有支配整个数据库资源的特权,对数据库拥有最大的特权。

2.3视图机制

通过为不同的用户定义不同的视图,可以将要保密的数据对无权存取的用户隐藏起来,从而自动地给数据提供一定程度的安全保护。

2.4数据加密

加密技术是防止数据库在存储或传输中失密的有效手段。

基本思想是:“根据一定的算法将原始数据变成不可直接识别的格式,再在数据库端解码

2.5审计

审计功能可以把用户对数据库的操作自动记录下来放入审计日志,有时也被称作“审计跟踪”,系统能利用审计跟踪的信息,重现导致数据库现状的一系列事件,以找出非法存取数据的人。

三.数据库完整性

数据库的完整性是指数据库中的数据“正确性”和“相容性”,即为了防止数据库中存在不符合语义的数据,防止错误信息的输入和输出。

为了实现数据库完整性DBMS必须提供表达完整性约束的方法。

3.1完整性约束条件的类型

完整性约束条件作用的对象可以是列、元组、关系三种。

完整性约束条件的类型可以分为两大类型:“静态约束”和“动态约束”。

3.1.1静态约束

静态约束是指数据库每一确定状态时的数据对象所应满足的约束条件,它是反应数据库状态合理性的约束,这是最重要的一类完整性约束

静态约束作用的对象不同,又可分为三种

  • 静态列约束:静态列约束是对一个列的取值域等的说明或限制。
  • 静态元组约束:规定组成一个元组的各个列之间的约束。
  • 静态关系约束:反映了一个关系中各个元组之间或者若干关系之间的约束。

3.1.2动态约束

动态约束是指数据库从一种状态转变为另一种状态时,新、旧值之间所满足的约束条件

  • 动态列约束:规定修改列定义或列值时应满足的约束条件。
  • 动态元组约束:修改某个元组的值时元组中的各个字段之间要满足某种约束条件。
  • 动态关系约束:在关系变化时的限制条件,例如:“事务一致性”、“原子性”等约束条件。

3.2完整性控制机制的功能

DBMS的完整性控制机制应该具有如下三个方面的功能。

3.2.1定义功能

提供定义完整性约束条件的机制。

3.2.2检查功能

检查用户发出的操作请求是否违反了完整性约束条件。

检查是否违背完整性约束条件通常是在一条语句执行后立即检查,这类约束称为“立即执行的约束”。

如果某个检查需要延迟到整个事务结束后再进行,这类约束称为“延迟执行的约束”。

3.2.3保护功能

如果发现用户的操作请求违背了完整性约束条件,则采取一定的保护动作来保证数据的完整性。

3.3完整性约束的表达方式

3.3.1在创建和修改基表模式时说明约束

SQL中的关键字

CREATE TABLE中声明某个属性或属性集作为某个关系的关键字,主要有两种方法:“使用PRIMARY KEY(主关键字)”、“使用保留字UNIQUE”。

在一个表中只有一个“PRIMARY KEY”,但可以有多个“UNIQUE”。

参照完整性和外部关键字

参照完整性是关系模式的另一种重要约束。

参照完整性有两个要求:

  • 被参照的第二个关系的属性必须是该关系的主关键字。
  • 对于第一个关系中外关键字的任何值,也必须出现在第二个关系的相应属性上。

 

维护参照完整性约束的策略有下面三种:

  • 默认策略:拒绝违规的更新。
  • 级联策略:被参照关系中元组修改的同时,参照关系中元组也会自动的修改,保持一一对应的原则。
  • 置空策略:对于被参照关系的删除和修改操作时独立进行的,这时可以采用置NULL策略,方法是在模式后面加上“ON DELETE SET NULL”或“ON UPDATE CASCADE”。

 

属性值的约束

属性值的约束表达方式是:“在关系模式的定义中对属性进行约束”、“首先约束某个域,然后再说明它是某个属性的域”。

  • 非空约束:限制属性值不为空,在后面加一个“NOT NULL”
  • 基于属性值检查的约束:该属性上的每一个值都要满足“CHECK后面的条件”,在后面加一个“CHECK (<条件>)”

  • 域约束:声明一个域来约束某个属性的取值。

全局约束

一个复杂的约束条件可能涉及几个属性甚至几个不同关系之间的联系,称为全局约束。

3.4用断言说明约束【了解即可

一个断言就是一个谓词,用以说明数据库状态必须满足的一个条件。

SQL中可以使用“ASSERTION”语句来说明断言,形式为:

不管什么样的数据库操作,只要它破坏了断言中的条件(使条件为假),系统就拒绝执行。

3.5用过程说明约束

在应用程序中插入一些过程,以检验数据库更新是否违背给定的约束。

如果违背约束,则回滚事务

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

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

相关文章

【STM32】SysTick系统滴答定时器

1.SysTick简介 CM4内核的处理和CM3一样&#xff0c;内部都包含了一个SysTick定时器&#xff0c;SysTick 是一个24 位的倒计数定时器&#xff0c;当计到0 时 &#xff0c;将 从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除&#xf…

使用Python发送电子邮件:轻松实现自动化沟通

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 1. 为什么使用Python发送电子邮件&#xff1f; 在当今这个信息爆炸的时代&#xff0c;电子邮件已经成为了日常生活中不可或缺的一部分。无论是工作还是生活&#xff0c;都可能需要通过电子邮件与他人进行沟通。而Py…

springboot项目mapper无法自动装配,未找到 ‘userMapper‘ 类型的Bean解决办法.

一开始我看到了这个回答&#xff1a;springboot项目mapper无法自动装配&#xff0c;未找到 ‘userMapper‘ 类型的 Bean解决办法&#xff08;含报错原因&#xff09;_无法自动装配。找不到 usermapper 类型的 bean。-CSDN博客 mapper无法自动装配&#xff0c;未找到 ‘userMap…

Open WebUI的SearXNG网络搜索配置【403报错解决方法】

1.拉取SearXNG镜像 docker pull searxng/searxng 2.在Docker Desktop的Images界面中启动searxng容器 3.查看searxng是否部署成功 在Docker Desktop的Containers界面中&#xff0c;查看searxgn暴露的端口。 http://localhost:31292/ 4.修改settings.yml配置参数 在Docker De…

python如何判断图片是否为空

如下所示&#xff1a; import cv2im cv2.imread(2.jpg) if im is None:print("图像为空") # cv2.imshow("ss", im) # cv2.waitKey(0)

【Spine学习11】之 战士攻击动作 思路总结(手动调整贝塞尔曲线实现前快后慢)

拿到一份psd文件先观察检查一下图片顺序有没有问题&#xff0c; 重点看一下人物的腿部分层&#xff0c;&#xff08;如果是大小腿分开画的就网格可打可不打&#xff0c;如果是连在一起画的&#xff0c;那必须打网格&#xff09; 拿着剑的时候剑和手的层级有没有错位&#xff0c…

如何一步一步将Python中的应用打包成安卓的APK安装包文件

一、首先&#xff0c;按照如下链接操作 Python 应用打包成 APK【全流程】_python打包成apk-CSDN博客 二、运行 buildozer init会报错buildozer命令找不到&#xff0c;明明已经安装 解决方法&#xff1a; 这里重新创建一个conda环境 Installation — Buildozer 0.11 docum…

Codepen Three.js环境依赖配置

Codepen Three.js环境依赖配置 前言 如果想在CodePen环境写Three.js依赖的项目&#xff0c;环境搭建可以参考该Codepen项目: Chill the lion 详细 打开设置可以看到以下配置 更多项目参考 1. Chill the Lion Chill the Lion 是一个基于 ThreeJS 制作的 WebGL 示例。它由…

基于llama3-8B-instruct的调用部署以及lora微调

基于llama3-8B-instruct的调用部署以及lora微调 1 Llama-3-8B-Instruct 基于FastApi 部署调用2 LLaMA3-8B-Instruct langchain 接入3 LaMA3-8B-Instruct 基于streamlit的web demo部署LLaMA3-8B-Instruct Lora 微调参考&#xff1a; 1 Llama-3-8B-Instruct 基于FastApi 部署调用…

Docker Desktop进入界面时一直转圈的解决办法记录

我的win10版本如下&#xff0c;是支持安装的&#xff0c;不支持安装的&#xff0c;可以先升级系统版本&#xff1a; 起初是因为运行Docker Desktop时一直转圈&#xff0c;无法进入主面板&#xff0c;百度之&#xff0c;需要安装hype-v环境&#xff0c;找到以下 勾选Hyper-V下的…

linux日志管理之journalctl命令

一、日志查询 1.输出所有日志或按相关要求输出 输出所有日志 #journalctl查看实时日志 #journalctl -f查看最后n行 #journalctl -n 10不分页显示 #journalctl --no-pager适合阅读模式 #journalctl -p 3 -o json-pretty 查看内核日志 #journalctl -k 2.按服务查询 #journal…

【MySQL进阶之路 | 高级篇】InnoDB搜索引擎行格式

1. COMPACT行格式 COMPACT行格式是MySQL5.1的默认行格式.其结构示意图如下. 大体可以分为两部分. 记录的额外信息.这里面有包括变长字段长度列表&#xff0c;NULL值列表和记录头信息.记录的真实数据. (1).变长字段长度列表 MySQL支持一些变长的数据类型.比如VARCHAR(m), VA…

【SCAU数据挖掘】数据挖掘期末总复习题库应用题及解析

1. 给定圆的半径为e &#xff0c;令 MinPts3&#xff0c;考虑下面两幅图。 &#xff08;1&#xff09;哪些对象是核心对象? m,p,o,r(因为这些核心对象在半径e的范围内都至少包含MinPts3个对象) &#xff08;2&#xff09;哪些对象是直接密度可达的? 对象q是…

node: /lib64/libm.so.6: version `GLIBC_2.27‘ not found (required by node)

node: /lib64/libm.so.6: version GLIBC_2.27‘ not found 错误信息解决方案操作步骤&#xff1a;1、下载node版本2、上传服务器3、解压4、将文件名改短5、脚本新增6、重新加载环境变量source /etc/profile7、配置阿里云镜像仓库8、服务器打包完成 错误信息 这个错误信息表示…

论文解读:Pandora: 朝着结合自然语言动作与视频状态的通用世界模型发展

论文《Pandora: 朝着结合自然语言动作与视频状态的通用世界模型发展》探索了构建一个高度集成的AI系统&#xff0c;旨在理解自然语言指令并在视频所代表的视觉环境中执行相应操作&#xff0c;从而推进对复杂动态场景的建模与预测能力。以下是该论文的关键点和贡献的详细解读&am…

聊聊JSON

引言 JSON的概念 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;它基于JavaScript的一个子集&#xff0c;但独立于语言&#xff0c;这意味着它可以被许多编程语言轻松解析。JSON的简洁性和易读性使其成为Web开发中数据交换的…

煤矿智能巡检机器人:推动煤矿行业变革的关键力量

目前我国煤炭资源总量达到了2078.85亿吨&#xff0c;已探明储量为1432亿吨&#xff0c;煤矿能源现阶段还是我国重要的基础能源。而煤矿生产作业存在巨大危险&#xff0c;主要包括高温、高压、燃爆和有毒气体等环境因素&#xff0c;同时机械设备运转过程中潜藏着重大风险。这些危…

MySQL 核心模块揭秘 | 21 期 | 行锁 (1) 快速加锁

行锁有两种加锁逻辑&#xff0c;这一期我们聊聊其中之一的快速加锁。 作者&#xff1a;操盛春&#xff0c;爱可生技术专家&#xff0c;公众号『一树一溪』作者&#xff0c;专注于研究 MySQL 和 OceanBase 源码。 爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&a…

【深海王国】小学生都能做的APP?AppInventor、BLE蓝牙、Arduino联合开发你的第一个手机远程控制程序(7)

Hi~ (o^^o)♪, 各位深海王国的同志们&#xff0c;早上下午晚上凌晨好呀~ 辛勤工作的你今天也辛苦啦(/≧ω) 今天大都督依旧为大家带来小学生都能学会的APP制作教程&#xff0c;帮你一周内快速开发一款可以和单片机无线通讯的手机蓝牙APP&#xff0c;let’s go&#xff01; &a…

Python13 时间格式转换

在Python中&#xff0c;时间格式转换通常指的是将日期和时间数据从一种表示形式转换成另一种。这种转换经常使用Python的datetime和time模块来实现。这些模块提供了多种工具&#xff0c;可以帮助用户将时间表示为字符串、时间戳&#xff0c;或是更加结构化的datetime对象等多种…