数据库原理20/6/23笔记

事务是数据库操作序列,这些操作要么全做,要么全不做

简单说就是all or none

既然是一个整体,那么最终会有两种结果

COMMIT 事务正常结束 即 对数据库的更新永久生效

另一种ROLLBACK 事务异常终止

事务回退到开始时的状态

事务的特征有

原子性
一致性
隔离性
持续性

  1. 原子性就是上边说的all or none
  2. 一致性是数据库中只包含成功事务提交的结果或者叫 一致性状态,反之则称为 不一致状态,即 数据库中包含失败事务的结果,
  3. 隔离性是一个事务的执行不能被并发执行的其他事务干扰
  4. 持续性也称永久性是指一个事务一旦提交,它对数据库中数据的改变就应该是永 久性的,永久的具体含义,不受断电影响,没电了,数据库更改依然有效

下边看事务并发,并发的概念,操作系统学过

并发就是宏观上并行,微观上不并行;或者叫微观上交替

多核出现以后,并行变得很普遍

微观上的同时执行,好在并发控制和并行控制,方法的基本原理一致

所以除了个别细节,并发、并行的基本处理思路大致相同


并发操作会带来不一致性

操作系统里专门引进了P、V操作

P操作实质上是 封锁,V操作实质上是 解锁

数据库的并发控制比操作系统考虑得更细致

还有一个区别在于可以reset,数据库上边说了叫 持续性

数据写进磁盘长期有效,reset不管用就是说数据库是管理数据的

还必须考虑,最终结果,数据的一致性

所以数据库的并发控制做得更深入一些

把 并发操作带来的数据不一致性分成三种情况

1 丢失修改

2 不可重复读

3 读“脏”数据

1:

898b046431ebc0e0aaab845ed4fa914

3:

91b946f2598481191edc2513f254446

2:

238a243b48b67d9197e3d5d38f5b481

数据库做得细致一些,对于数据操作

读和写按照不同的方法进行处理

对 锁分成了两种类型   读锁和写锁

读锁 又叫 共享锁

读锁 又叫 共享锁简记为S锁(share锁)

写锁 又叫 排它锁,简记为X锁

X是 排它英文单词eX......

现在看一下两种锁的区别:

数据加了 排它锁,其它事务就不能再给数据加 任何锁

而 共享锁 是一个事务加给数据了 S锁,其它事务还可以再加 S锁

5467aa9f03c75e20a6d0cf917f75480

这个图显示了所有情况,S锁和S锁 相容

S锁和S锁 相容,S锁和X锁 不相容,X锁和X锁也 不相容


用锁的方法称为 封锁协议

有三种封锁协议、递进关系

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

从叙述来看,一级封锁协议针对 数据修改一级封锁协议针对 数据修改,也就是 写操作

它的作用是解决 丢失修改 问题

2889671ac55a4a2ceb88b20f9438460

二级封锁协议:一级封锁协议+事务T在读取数据R前必须先加S锁,读完后即可 释放S锁

以前,读脏数据的原因是对 读 没有加任何限制。现在,读 之前需要加S锁

但是,根据锁的相容性,数据上有X锁,导致S锁加不上去,也就读不成,直到另一个事务撤销,

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

区别在:S锁,直到 事务结束才释放vsS锁,读完后即可 释放S锁,即 S锁的释放时间不同

显然三级封锁协议 更严格,相应的它能解决的问题就更多

三级封锁协议 可以解决 防止丢失修改+不读脏数据+可重复读

93748522f69d8ab85a3fc4dddc1b0a0

原来 不可以重复读,是因为 没有S锁,或者 读完后立即释放S锁,给中间其它事务修改数据留下了空隙

现在S锁,直到 事务结束才释放,根据锁的相容性

数据上有S锁,X锁加不上去,因而也无法被修改

从而保证两次读取结果一致

总结:

de5d2f1ba644283d2ae2017ccb7ba03

另一角度

并行是否正确取决于结果是否等于 串行

并发结果=串行结果得到的协议叫两段锁协议

posted @ 2020-06-23 17:58  淇实是我  阅读(160)  评论(0编辑  收藏  举报