数据库事务
2019-05-13 21:51
22 查看
ACID
A(Atomicity):事物是数据库的逻辑工作单位,事物中的诸操作要么都做,要么都不做。 C(Consistency):事物的执行结果必须是使数据库从一个一致性状态变到另一个一致性状态。 I(Isolation):一个事物的执行不能被其它事物干扰。 D(Durability):事物一旦提交,对数据库的改变是永久性的。
数据不一致的情况
1、丢失修改 T1和T2读入统一数据并修改,T2的提交破坏了T1提交的结果,导致T1的修改被丢失。 eg:库存a=10,T1中a=a-1,然后提交。T2中a=a-1,然后提交。这样最后a=9,实际上为8。 2、不可重复读(分为三种) 2.1、事物T1读取某一数据后,T2对其作了修改,当事物T1再次读取时,不一致。(update) 2.2、事物T1读取某一数据后,T2对其作了删除,当事物T1再次读取时,数据消失。(delete) 2.3、事物T1读取某一数据后,T2对其作了新增,当事物T1再次读取时,多了一些记录。(add) 3、脏读 T1修改某一个数据,回写到磁盘后,T2读取同一数据后,T1回滚了,T2读到的就是脏数据。
封锁
排它锁(写锁)
共享锁(读锁):事物T对A数据加上共享锁S之后,T只能读A,不能修改A,其它事物只能对A加共享锁。
活锁:一直在等待。解决方法:排队 死锁:解决方法 1、预防 一次封锁法:一次将所有需要的数据封锁。缺点:扩大数据范围,降低效率 顺序封锁法:预先对数据对象规定一个封锁顺序,所有事物都按照这是顺序实行封锁。 例如在B树结构中,可以规定封锁的顺序是根节点开始,然后是下一级的子女节点,逐级封锁。 缺点:需要维护封锁对象,增加成本/难以确定每一个事物要封锁哪些对象,很难按规定的顺序去施加封锁。 2、检测 超时检测:认为事物等待超过了规定时间就发生了死锁。缺点:可能误判或者时间不好设置 等待图法:事物为点,事物的等待为有向边.如果发生了回路,就表明发生了死锁。
可串行化调度
多个事物的并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事物时的结果相同,称这种调度策略为可串行化。
两段锁协议
是指所有事物必须分为两个阶段对数据项加锁和解锁。 1、对任何数据进行读、写操作之前,首先要申请并获得对该数据的封锁。 2、在释放一个封锁之后,事物不在申请和获得任何其它封锁。 解释:事物分为两个阶段,第一阶段是获得封锁,也称为扩展阶段。在这个阶段,事物可以申请获得任何数据项上的任何类型的锁,但是 不能释放任何锁。第二个阶段是释放封锁,也成收缩阶段。在这个阶段,食物可以释放任何数据项上的任何类型的锁,但是不能再申请任何锁。 遵守两段锁协议的一定是可串行化调度的,反之则不一定。