数据库管理——并发控制

并发控制

目录:

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

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中所允许的最低一致性级别。

猜你喜欢

转载自my.oschina.net/u/3786691/blog/1816299