数据库管理——并发控制

并发控制数据库

目录:并发

1.并发操做带来的3个问题spa

2.封锁技术对象

3.封锁带来的问题事务

4.并发操做的调度同步

5.SQL对事务并发处理的支持变量

 

1.并发操做带来的几个问题程序

1.丢失更新问题方法

2.读脏数据问题技术

3.不可重复读问题

4.幻读

 

2.封锁技术

定义:锁是一个与数据项相关的变量,对可能应用于该数据项上的操做而言,锁描述了该数据项的状态。

一般在数据库中的每一个数据项都有一个锁。锁的做用是使并发事务对数据库中数据项的访问可以同步。封锁技术中主要有两种封锁:排他型封锁和共享型封锁。

1.排他型封锁(写锁,X锁)

定义:若是事务T对某个数据R实现了X锁,那么在T对数据R解除封锁以前,不容许其余事务T再对该数据加任何类型的锁。

2.共享型封锁(读锁,S锁)

定义:若是事务T对某数据加上S锁后,仍容许其余事务再对该数据加S锁,但在对该数据的全部S锁都接触以前,决不容许任何事务对该数据加X锁。

3.封锁的粒度

X锁和S锁都是加在某一个数据对象上的。封锁的对象能够是逻辑单元,也能够是物理单元。

定义:封锁对象的大小称为封锁的粒度。

封锁粒度与系统的并发度和并发控制的开销密切相关。封锁的力度越大,并发度也就越小,同时系统的开销也就越小。

所以选择封锁粒度时必须同时考虑封锁机构和并发度两个因素,对系统的开销与并发度进行权衡。

 

3.封锁带来的问题

采用封锁技术,能够避免并发操做引发的各类错误,但有可能产生其余3个问题:活锁,饿锁,死锁。

1.“活锁”问题

定义:系统可能使某个事务永远处于等待状态,得不到封锁的机会,这种现象称为“活锁”。

解决:①先来先服务;②若是事务有优先级,能够采用等待时间长“升级”的策略。

2.“饿锁”问题

定义:有可能存在一个事务序列,其中每一个事务都申请对某数据项加S锁,且每一个事务在受权加锁后的一小段时间内释放封锁,此时若另有一个事务T2欲在该数据项上加X锁,则将永远轮不上封锁的机会。

解决:能够用下列方式受权加锁来避免事务饿死。

①不存在数据项Q上持有X锁的其余事务。

②不存在等待对数据项Q加锁且优先于T2申请加锁的事务。

3.“死锁”问题

定义:系统中有两个或两个以上的事务都处于等待状态,而且每一个事务都在等待其中另外一个事务接触封锁,它才能继续执行下去,结果形成任何一个事务都没法继续执行,这种现象成系统进入“死锁”状态。

解决:若是发生死锁,那么只能抽取某个事务做为牺牲品,把它撤销,作回退操做,解除它的全部封锁,恢复到该事务的初始状态。

 

4.并发操做的调度

1.事务的调度、串行调度和并发调度

定义:事务的执行次序称为“调度”。若是多个事务依次执行,则称为事务的串行调度。若是利用分时的方法同时处理多个事务,则称为事务的并发调度。

若是有n个事务并发调度,可能的并发调度数目远远大于n!。但其中有的并发调度是正确的,有的是不正确的。如何产生正确的并发调度,是由DBMS的并发控制子系统实现的。

2.可串行化概念

每一个事务中,语句的前后顺序在各类调度中始终保持一致。在这个前提下,若是一个并发调度的执行结果与某一串行调度的执行结果等价,那么这个并发调度称为“可串行化的调度”,不然是不可串行化的调度。

 

5.SQL对事务并发处理的支持

SQL2对事务的存取模式隔离级别作了具体规定,并提供语句让用户使用,以控制事务的并发执行。

1.事务的存取模式

①READ ONLY(只读型)。事务对数据库的操做只能是读操做。定义这个模式后,表示随后的事务均是只读型。

②READ WRITE(读写型)。事务对数据库的操做可使读操做,也能够是写操做。定义了这个模式后,表示随后的事务均是读写型。在程序开始时,默认为这种模式。

2.事务的隔离级别

①SERIALIZABLE(可串行化)。容许事务与其余事务并发执行,单系统必须保证并发调度是可串行化的,不致发生错误。在程序开始时默认这个级别。

②REPEATABLE READ(可重复读)。只容许事务读已提交的数据,而且在两次读同一个数据时不容许其余事务修改此数据。

③READ COMMITTED(读提交数据)。容许事务读已提交的数据,但不要求“可重复读”。

④READ UNCOMMITTED(能够读未提交数据)。容许事务读已提交或未提交的数据。这是SQL2中所容许的最低一致性级别。

相关文章
相关标签/搜索