1、*,数据库原理及应用,电子科技大学,-,陆鑫,数据库系统原理与开发,5.3,并发控制,锁机制、控制协议、死锁、事务隔离,了解数据库锁机制,了解并发控制协议,理解,两阶段锁协议,如何,解决,可串行调度,问题,了解,并发事务在运行过程中出现死锁,条件,掌握,在,DBMS,中,如何设置,事务隔离级别,【,本节学习目标,】,一、数据库锁机制,为了,解决多个事务并发对共享数据进行新增、,更新、删除、,查询带来的数据不一致性问题,时,,需要对共享数据进行加锁访问。,基于锁表的数据库共享资源访问,排它锁定,(Lock-X),锁定后,不允许其它事务对共享数据再加锁,共享锁定,(Lock-S),锁定后,只允许其
2、它事务对共享数据添加读取锁,1.,资源锁定访问,在,DBMS,中,通过加入锁表机制,来实现共享,数据,锁定访问,,其加锁方式包含如下类型,。,2.,资源锁定粒度,数据库,粒度最大,表,粒度较大,页面,粒度中等,行,粒度小,3.,资源锁定实施方式,隐式锁定,DBMS,缺省执行,显式锁定,加锁命令显式执行,二、基于锁机制的并发控制协议,为了,实现并发事务,对,共享数据,访问的,串行化调度执行,还必须约束它们对共享数据的操作访问必须是以互斥方式进行。这就需要用到,基于,数据库锁机制,的并发控制协议,。,1.,锁操作的相容性,排它锁,共享锁,无锁,排它锁,否,否,是,共享锁,否,是,是,无锁,是,是,
3、是,2.,加,锁,协议,一级加锁协议,:,任何事务在修改共享数据对象之前,必须对该数据执行排它锁定指令,直到该事务处理完成,才进行解锁指令执行。,例,某航班,剩,余机票数据,A,的当前值为,100,张。现有分别来自不同售票点的两个并发事务,T1,和,T2,,其中,T1,事务将售出,1,张机票,,T2,事务将售出,2,张机票。以下分别给出它们在不加锁和按一级加锁协议的并发事务调度执行情况,见,下,图所示。,特点,:,使用一级加锁协议,可避免出现更新丢失问题。,但,不能解决“不可重复读取”、“脏读”等数据不一致问题。,执行结果,A,=99,,结果有错,执行结果,A,=97,,结果正确,二,级加锁协
4、议,:,在一级加锁协议基础上,针对并发事务,的,共享数据读操作,必须对该数据执行共享锁定指令,读完数据后即刻释放共享锁定。,例,某航班,剩,余机票数据,A,的当前值为,100,张。现有分别来自不同售票点的两个并发事务,T1,和,T2,,其中,T1,事务将售出,1,张机票,,T2,事务进行机票空余数查询。以下分别给出它们在按一级加锁协议执行和按二级加锁协议的事务调度执行情况,见,下,图所示。,特点,:,该加锁协议不但可以防止“丢失更新”的数据不一致性问题,还可防止出现脏读数据问题。,但,有可能会出现“不可重复读取”的数据不一致问题。,T2,事务读取了脏数据,A=99,T2,事务读取,正确,数据,
5、A=100,三,级加锁协议,:,在一级加锁协议基础上,针对并发事务对共享数据进行读操作,必须对该数据执行共享锁定指令,直到该事务处理结束才释放共享锁定。,例,某航班,剩,余机票数据,A,的当前值为,100,张。现有分别来自不同售票点的两个并发事务,T1,和,T2,,其中,T1,事务将售出,1,张机票,,T2,事务进行机票空余数查询。以下分别给出它们在按二级加锁协议执行和按三级加锁协议的并发事务调度执行情况,见,下,图所示。,特点,:,该加锁协议不但可以防止“丢失更新”、“脏读”的数据不一致性问题,还可防止出现“不可重复读取”的数据一致性问题。,T2,事务,首次,读取,A=100,T2,事务,再
6、次,读取,A=99,T2,事务,首次,读取,A=100,T2,事务,再次,读取,A=100,加锁协议级别,排它锁,共享锁,不丢失更新,不脏读,可重复读,一级,全程加锁,不加,是,否,否,二级,全程加锁,开始时加锁,读完数据释放锁定,是,是,否,三级,全程加锁,全程加锁,是,是,是,3.,不同级别,锁,协议比较,三、两阶段锁定协议,并发事务的正确调度准则:,一个给定的并发事务调度,当且仅当它是可串行化时,才能保证正确调度。,保证可串行化的一个协议是:,二阶段锁定协议,二阶段锁定协议,规定每个事务必须分两个阶段提出加锁和解锁申请,:,增长阶段,事务只能获得锁,但不能释放锁。,缩减阶段,事务只能释放
7、锁,但不能获得新锁。,事务,T,增长阶段,缩减阶段,事务,T,符合两阶段锁定协议,可实现串行化调度。,判断下列事务是否可串行化调度?,事务,T1,事务,T2,加锁,解锁,加锁,解锁,加锁,加锁,解锁,解锁,结论,:,若并发事务执行的所有事务都遵从两阶段锁定协议,则这些事务的任何并发调度都是可串行化调度,即这些并发调度执行结果可以保证数据库一致性。,不可串行化,可串行化,四、死锁问题解决,在基于锁机制的并发事务执行中,如果这些事务同时锁定两个以及以上资源时,可能会出现彼此都不能继续执行的状态,即,事务死锁,状态,。,1.,事务死锁,例,两个事务,T1,和,T2,,它们都需要加锁访问数据库表,Ta
8、ble1,和,Table2,,其事务程序见图,6-20a,所示。当这两个事务程序调度执行时,只要不是按可串行化调度执行,则它们在执行时会出现死锁状态,,,见图,6-20b,所示。,允许用户一次发出当前所需全部资源的锁定,使用完成后,再释放给其它用户访问。,规定所有应用程序锁定资源的顺序必须完全相同。,2.,死锁出现的必要条件,3.,防范死锁的策略,互斥条件,请求和保持条件,不剥夺条件,环路等待条件,当发生死锁时,回滚其中的一个事务,并取消它对数据库所做的改动。,4.,解决死锁的办法,五、事务隔离级别,说明:,事务隔离级别设置是在,DBMS,中执行,SET TRANSACTION,命令来实现或通过管理工具设置。事务隔离级别设置越高,出现数据不一致的可能性越小,但系统吞吐量也越小。,本节学习结束!,