概述
有点像操作系统啊
原子性、一致性、隔离性和持久性
一、原子性(atomicity)
一个事务要么全部提交成功,要么全部失败回滚,不能只执行其中的一部分操作,这就是事务的原子性
二、一致性(consistency)
事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处于一致性状态。
如果数据库系统在运行过程中发生故障,有些事务尚未完成就被迫中断,这些未完成的事务对数据库所作的修改有一部分已写入物理数据库,这是数据库就处于一种不正确的状态,也就是不一致的状态
三、隔离性(isolation)
事务的隔离性是指在并发环境中,并发的事务时相互隔离的,一个事务的执行不能不被其他事务干扰。不同的事务并发操作相同的数据时,每个事务都有各自完成的数据空间,即一个事务内部的操作及使用的数据对其他并发事务时隔离的,并发执行的各个事务之间不能相互干扰。
在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同,分别是:未授权读取,授权读取,可重复读取和串行化
1、读未提交(Read Uncommited),该隔离级别允许脏读取,其隔离级别最低;比如事务A和事务B同时进行,事务A在整个执行阶段,会将某数据的值从1开始一直加到10,然后进行事务提交,此时,事务B能够看到这个数据项在事务A操作过程中的所有中间值(如1变成2,2变成3等),而对这一系列的中间值的读取就是未授权读取
2、授权读取也称为已提交读(Read Commited),授权读取只允许获取已经提交的数据。比如事务A和事务B同时进行,事务A进行+1操作,此时,事务B无法看到这个数据项在事务A操作过程中的所有中间值,只能看到最终的10。另外,如果说有一个事务C,和事务A进行非常类似的操作,只是事务C是将数据项从10加到20,此时事务B也同样可以读取到20,即授权读取允许不可重复读取。
3、可重复读(Repeatable Read)
就是保证在事务处理过程中,多次读取同一个数据时,其值都和事务开始时刻是一致的,因此该事务级别禁止不可重复读取和脏读取,但是有可能出现幻影数据。所谓幻影数据,就是指同样的事务操作,在前后两个时间段内执行对同一个数据项的读取,可能出现不一致的结果。在上面的例子中,可重复读取隔离级别能够保证事务B在第一次事务操作过程中,始终对数据项读取到1,但是在下一次事务操作中,即使事务B(注意,事务名字虽然相同,但是指的是另一个事务操作)采用同样的查询方式,就可能读取到10或20;
4、串行化
是最严格的事务隔离级别,它要求所有事务被串行执行,即事务只能一个接一个的进行处理,不能并发执行。
四、持久性(durability)
一旦事务提交,那么它对数据库中的对应数据的状态的变更就会永久保存到数据库中。--即使发生系统崩溃或机器宕机等故障,只要数据库能够重新启动,那么一定能够将其恢复到事务成功结束的状态
1.丢失修改
发生在两个写
2.不可重复读
一个读,一个更新数据库对象
幻读
幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的“全部数据行”。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入“一行新数据”。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样.一般解决幻读的方法是增加范围锁RangeS,锁定检锁范围为只读,这样就避免了幻读。
3.读脏数据
数据库的中间状态
封锁以及封锁协议
基本封锁类型
排它锁 X,
共享锁,S,T只能读A不能改A
---------------------------------------------------------------------
何时申请、持续时间、何时释放
-----------------------------------------------------------------------------------
一级封锁协议:修改数据前必须先对加锁X,防止丢失修改;但是仅仅读的话,不加锁,不能保证可重复读和不读脏数据
二级封锁协议:修改数据前加X,读的时候加S,S是读完就释放。可以防止读脏数据
过程中需要结合相容矩阵
三级封锁协议:S锁也是直到事务结束才释放。
活锁和死锁
活锁:活着就是思而不得,辗转反侧。
解决:先来先服务
----------------------------------------------
死锁:
两类方法
1、死锁的预防
死等对方,
(1)一次封锁法,把所有要用到的都加锁;咋能直接获得要封锁的呢?太难了
(2)顺序封锁法,规定封锁顺序;封锁序列也是资源啊,能本也不少
2、死锁的诊断与解除
(1)超时法
(2)等待图法
---------------------------------------------------------------
解除死锁:
选择一个处理死锁代价最小的撤销
可串行化调度与冲突可串行化调度
读没事,写不同也没有事
两段锁协议
是可串行化的充分条件。
封锁的粒度
自己加锁会对上架有影响
--------------------------------------------------------------------
意向锁:
就是加基本锁之前先给前面的祖先加意向锁