事务是数据库操作序列,这些操作要么全做,要么全不做
简单说就是all or none
既然是一个整体,那么最终会有两种结果
COMMIT 事务正常结束 即 对数据库的更新永久生效
另一种ROLLBACK 事务异常终止
事务回退到开始时的状态
事务的特征有
原子性
一致性
隔离性
持续性
- 原子性就是上边说的all or none
- 一致性是数据库中只包含成功事务提交的结果或者叫 一致性状态,反之则称为 不一致状态,即 数据库中包含失败事务的结果,
- 隔离性是一个事务的执行不能被并发执行的其他事务干扰
- 持续性也称永久性是指一个事务一旦提交,它对数据库中数据的改变就应该是永 久性的,永久的具体含义,不受断电影响,没电了,数据库更改依然有效
下边看事务并发,并发的概念,操作系统学过
并发就是宏观上并行,微观上不并行;或者叫微观上交替
多核出现以后,并行变得很普遍
微观上的同时执行,好在并发控制和并行控制,方法的基本原理一致
所以除了个别细节,并发、并行的基本处理思路大致相同
并发操作会带来不一致性
操作系统里专门引进了P、V操作
P操作实质上是 封锁,V操作实质上是 解锁
数据库的并发控制比操作系统考虑得更细致
还有一个区别在于可以reset,数据库上边说了叫 持续性
数据写进磁盘长期有效,reset不管用就是说数据库是管理数据的
还必须考虑,最终结果,数据的一致性
所以数据库的并发控制做得更深入一些
把 并发操作带来的数据不一致性分成三种情况
1 丢失修改
2 不可重复读
3 读“脏”数据
1:
3:
2:
数据库做得细致一些,对于数据操作
读和写按照不同的方法进行处理
对 锁分成了两种类型 读锁和写锁
读锁 又叫 共享锁
读锁 又叫 共享锁简记为S锁(share锁)
写锁 又叫 排它锁,简记为X锁
X是 排它英文单词eX......
现在看一下两种锁的区别:
数据加了 排它锁,其它事务就不能再给数据加 任何锁
而 共享锁 是一个事务加给数据了 S锁,其它事务还可以再加 S锁
这个图显示了所有情况,S锁和S锁 相容
S锁和S锁 相容,S锁和X锁 不相容,X锁和X锁也 不相容
用锁的方法称为 封锁协议
有三种封锁协议、递进关系
一级封锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放
从叙述来看,一级封锁协议针对 数据修改一级封锁协议针对 数据修改,也就是 写操作
它的作用是解决 丢失修改 问题
二级封锁协议:一级封锁协议+事务T在读取数据R前必须先加S锁,读完后即可 释放S锁
以前,读脏数据的原因是对 读 没有加任何限制。现在,读 之前需要加S锁
但是,根据锁的相容性,数据上有X锁,导致S锁加不上去,也就读不成,直到另一个事务撤销,
三级封锁协议:一级封锁协议+事务T在读取数据R之前必须先对其加S锁,直到 事务结束才释放
区别在:S锁,直到 事务结束才释放vsS锁,读完后即可 释放S锁,即 S锁的释放时间不同
显然三级封锁协议 更严格,相应的它能解决的问题就更多
三级封锁协议 可以解决 防止丢失修改+不读脏数据+可重复读
原来 不可以重复读,是因为 没有S锁,或者 读完后立即释放S锁,给中间其它事务修改数据留下了空隙
现在S锁,直到 事务结束才释放,根据锁的相容性
数据上有S锁,X锁加不上去,因而也无法被修改
从而保证两次读取结果一致
总结:
另一角度
并行是否正确取决于结果是否等于 串行
并发结果=串行结果得到的协议叫两段锁协议