【数据库系统概论】-并发控制

来源:互联网 发布:mysql 时间虚表 编辑:程序博客网 时间:2024/05/18 02:11

数据库是一个共享资源,可以供多个用户使用。在但处理机系统中,

在单处理机系统中,事务的并行执行实际上是这些并行事务的并行操作轮流交叉运行,这些并行执行方式称为交叉并发方式。最然但处理机系统中的并行事务并没有真正地运行,但是减少了处理机的空闲时间,提高了系统的效率。

在多处理机系统中,每个处理机可以运行一个事务,多个处理机可以同时运行多个事务,实现多个事务真正的并行运行。这种并行执行方式称为同时并发方式。

当若对并发操作不加控制就可能会存取和存储不正确的数据,破坏事务的一致性和数据库的一致性。所以数据库管理系统必须提供并发控制机制。

并发控制概述

事务是并发控制的基本单位,保证事务ACID特征事故是事务处理的重要任务。

为了保证事务的隔离性和一致性,DBMS需要对并发操作进行正确调度。这些就是数据库管理系统中并发控制机制的责任。

1、丢失修改

两个事务读入同一数据并修改,T2提交的结果破坏了T1提交的结果,导致T1的修改被丢失。

2、不可重复读

事务T1读取数据后,事务T2执行更新操作,使T1无法再现前一次读取结果。

(1)T2修改数据

(2)T2增加数据

(3)T2删除数据

3、读“脏”数据

所谓“脏”数据,即不正确的数据。


产生上述三类数据不一致性的主要原因是并发操作破坏了事务的隔离性。并发控制就是要用正确的方式调度并发操作,使一个用户事务的执行不受其他事务的干扰,从而避免造成数据的不一致性。

另一方面,对数据库的应用优势允许某些不一致性。

并发控制的主要技术有封锁、时间戳和乐观控制法,商用的DBMS一般都采用封锁方法。

封锁

封锁是实现并发控制的一个非常重要的技术。所谓封锁就是事务T在对某个数据对象操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其他的事务不能更新此数据对象。

确切的控制由封锁类型决定,基本的封锁类型有排它锁、共享锁(读者写者问题)

排它锁又称为写锁。若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。保证了其他事务在T释放A上的锁之前不能再读取和修改A

共享锁又称为读锁。若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务职能再对A加S锁,而不能加X锁,直到T释放A上的S锁。保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。

活锁和死锁

封锁方法可能引起活锁和死锁问题

活锁

如果事务T1封锁了数据R,事务T2又请求封锁R,于是T2等待,T3也请求封锁R,当T1释放了R上的封锁之后系统首先批准了T3的请求,T2仍然等待。然后T4又请求封锁R,当T3释放了R上的封锁之后系统又批准了T4的请求。。。T2有可能永远等待,这就是活锁。

避免活锁的简单方法是采用先来先服务策略。当多个事务请求封锁同一数据对象时,封锁子系统按请求封锁的先后次序对事务排队,数据对象上的锁一旦释放就批准申请队列中第一个事务获得锁。

死锁

如果事务T1封锁了数据R1,T2封锁了数据R2,然后T1又请求封锁R2,因T2已经封锁了R2,于是T1等待T2释放R2上的锁。形成死锁。

目前在数据库中解决死锁问题的两类方法:一类方法是采取一定措施来预防死锁的发生;另一类方是允许发生死锁,采用一定手段定期诊断系统中有无死锁,若有则解除。

1、死锁的预防

在数据库中,产生死锁的原因是两个或多个事务都已经封锁了一些数据对象,然后都要请求对已经为其他事务封锁的数据对象加锁,从而出现死等待。防止死锁的发生其实就是要破坏产生死锁的条件。

(1)一次封锁法

一次封锁法要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行。

这样降低了系统的并发度

(2)顺序封锁法

预先对数据对象规定一个封锁顺序,所有事务都按照这个顺序实行封锁。

成本高,很难按照规定的顺序去施加封锁

2、死锁的诊断与解除

(1)超时法

如果一个事务的等待时间超过了规定的时限,就认为发生了死锁。

可能误判死锁,死锁发生后也不能及时发现

(2)等待图法

事务等待图是一个有向图G=(T,U)。T为结点的集合,每个结点表示正运行的事务;U为边的集合,每条边表示事务等待的情况。

事务等待图动态地反映了所有事务的等待情况,并发控制子系统周期性地生成事务等待图,并进行检测。如果发现图中存在回路,则表示系统中出现了死锁。

并发调度的可串行性

DBMS对并发事务不同的调度可能会产生不同的结果,串行调度是正确的,执行结果等价于串行调度的调度也是正确的,这样的调度叫做可串行化调度。

可串行化调度

定义:多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事务时的结果相同,这种调度策略称为可串行化的。

可串行性是并发事务正确调度的准则。按照这个准则的规定,一个给定的并发调度,当且仅当它是可串行化的,才认为是正确调度。

冲突可串行化调度

冲突操作是指不同事务对同一个数据的读写操作和写写操作。

一个调度Sc在保证冲突操作的次序不变的情况下,通过交换两个事务不冲突操作的次序得到另一个调度Sc‘,如果Sc’是串行的,称调度Sc为冲突可串行化。

一个调度是冲突可串行化,一定是可串行化的调度,因此可以用这种方法来判断一个调度是否是冲突可串行化的。

两段锁协议

在运用封锁方法时,对数据对象加锁时需要约定一些规则,例如何时申请封锁、持锁时间、何时释放封锁等等,我们称这些规则为封锁协议

所谓两段锁协议是指所有事务必须分两个阶段对数据项加锁和解锁。

(1)在对任何数据进行读写操作之前,首先要申请并获得对该数据的封锁。

(2)在释放一个封锁之后,事务不再申请和获得任何其他封锁。

所谓“两段”锁的含义是,事务分为两个阶段:

第一阶段是获得封锁,也成为扩展阶段。在这个阶段事务可以申请获得任何数据项上的任何类型的锁,但是不能释放任何锁。

第二个阶段是释放封锁,也成为收缩阶段。在这个阶段事务可以释放任何数据项上的任何类型的锁,但是不能再申请任何锁。

可以证明,若并发执行的所有事务均遵守两段锁协议,则对这些事务的任何并发调度策略都是可串行化的。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 肚子又胀又痛怎么办 1岁宝宝肚子胀气怎么办 2岁宝宝肚子胀气怎么办 产后腰粗肚子大怎么办 发烧后腹泻拉水怎么办 又吐又拉还发烧怎么办 喝中药恶心想吐怎么办 生完孩子肛门疼怎么办 拉完大便肛门痛怎么办 肚子总是凉凉的怎么办 京东金条风控了怎么办 京东维修没发票怎么办 假牙吞到肚子里怎么办 眼睛一只大一只小怎么办 一个眼睛大一个眼睛小怎么办 电脑上的字模糊怎么办 无忧乐行注销了怎么办 连供墨盒有空气怎么办 30岁突然停经了怎么办 下面很痒怎么办白带多 私处有点痒怎么办洗液 人的下体皮肤痒怎么办 打球手指关节肿了怎么办 婴儿2个月鼻塞怎么办 3个月婴儿鼻塞怎么办 2个月婴儿感冒了怎么办 头发剪短了很丑怎么办 头发剪了后悔了怎么办 额头的碎头发翘怎么办 带耳机时间长耳朵疼怎么办 种的睫毛容易掉怎么办 走路多了脚背疼怎么办 扭伤脚筋怎么办恢复快 脚背上的筋断了怎么办 腿上的筋疼怎么办 脚筋拉伤怎么办恢复快 手指的筋断了怎么办 皮和肌肉粘连了怎么办 手筋拉伤怎么办恢复快 突然手腕的筋痛怎么办 手筋拉伤肿了怎么办