《2022年网络数据库讲稿收集 .pdf》由会员分享,可在线阅读,更多相关《2022年网络数据库讲稿收集 .pdf(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、并发控制机制一、并发控制的概念SQL Server 是多用户系统,即支持多个不同的程序或多个用户独立执行同一个程序同时存取数据库中相同的数据。SQL Server 以事务为单位,可同时运行多个事务并行存取数据。多个事务交迭地执行,称为并发处理。 并发处理可能会导致数据完整性与一致性方面的问题,如丢失更新、读出的是未提交的数据、非一致检索的问题等。为此,SQL Server 必须对这种并发操作提供一定的控制以防止它们彼此干扰,从而保证数据库的正确性不被破坏,这种处理就是并发控制。通常使用锁来实现并发控制,协调并发操作以保证事务的隔离性,保持数据的一致性。二、并发异常问题当多个事务交错执行时,可能
2、出现不一致性的问题,也称为并发控制问题,典型的并发处理产生的错误结果有如下三种。1. 丢失更新当两个事务T1 和 T2 同时更新某条记录时,它们读取记录并修改,事务T2 提交的结果破坏了 T1 提交的结果,导致T1 的修改结果丢失。现以一个库存进出的实例进行分析。假设当前某商品S1 的在库数量是200,现在有两个并发事务T1 和 T2 都将更新在库存中的数量,T1 是采购入库事务,T2 是卖出出库事务,即事务事务完成后的计算结果T1:入库 400库存数量 =库存数量 +400T2:出库 80库存数量 =库存数量 -80表 1 给出了在正常情况下这些事务的执行顺序和正确的结果,正确的最后执行结果
3、应该是 520。表 1 两个事务正常执行的过程执行顺序事务步骤数据库中结果1T1读出库存数量2002T1库存数量 =库存数量 +4003T1将结果写回数据库6004T2读库存数量6005T2库存数量 =库存数量 -80名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 6 页 - - - - - - - - - 6T2将结果写回数据库520由于事务的处理是并发执行的,它们执行的过程流可能是交替的,如表2 的执行过程,在这种执行顺序中会产生丢失更新时事务的执行顺序,表中当第二个
4、事务T2 执行时, T1 还未提交。表 2 发生数据丢失更新的过程执行顺序事务步骤数据库中结果1T1读出库存数量2002T2读出库存数量2003T1库存数量 =库存数量 +4004T2库存数量 =库存数量 -805T1将结果写回数据库600(将被丢失)6T2将结果写回数据库120在表 2 中,由于事务 T1 和 T2 是交替执行的, 在将更新的结果写回数据库时,T1 写入后马上由 T2 写入它所计算出的值,此时最后数据库中的结果是120,与表 1 中所得出的结果是完全不同的,因此,如果对数据库更新时的并发事务不加以控制,将会出现大量的不可预期的错误结果。2读未提交数据当两个事务T1 和 T2
5、并发执行时,在T1 对数据库更新的结果没有提交之前,T2 使用了T1 的结果, 如果在 T2 读取数据之后T1 又撤消事务, 就可能引起错误。读未提交数据产生的根源是违反了事务的隔离性。仍以上述实例来讨论。假定事务 T1 在增加了400 个商品后, 在没有提交之前撤消了这个操作,所以事务T2 应该是从原来的库存数量200 中减去 80,正确结果应该是120。正确的操作顺序和结果如表3 所示。表 3 两个事务正常的执行顺序执行顺序事务步骤数据库中结果1T1读出库存数量2002T1库存数量 =库存数量 +4003T1将结果写回数据库6004T1*ROLLBACK*2005T2读出库存数量2006T
6、2库存数量 =库存数量 -807T2将结果写回数据库120名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 6 页 - - - - - - - - - 当 T1 和 T2 的交替执行步骤如表4 时, T2 使用了 T1 末提交的数据,从而产生了错误数据 520。我们把读出的这种未提交的数据称为废数据或者脏数据。表 4 T2 使用 T1 未提交数据后产生的错误执行顺序事务步骤数据库中结果1T1读出库存数量2002T1库存数量 =库存数量 +4003T1将结果写回数据库6004
7、T2读出库存数量6005T2库存数量 =库存数量 -806T1*ROLLBACK*2007T2将结果写回数据库5203不可重复读取有时,一个事务可能对同一个数据连续读两次,然而事务的并发执行可能导致在两次读之间插入了另一个更新事务,这样会使前一个事务的两次读出的同一个数据值不一致,这就是不可重复读取问题。由于事务很可能读某些变化之前或变化之后的数据,就可能产生不一致的结果。例如:资金转帐过程中需要打印票据,系统中事务活动顺序如下:(1)事务 T1 打印 A 帐户转帐前的余额,设A=10 万元。(2)事务 T1 从 A 帐户转出1 万元, A=9 万元。(3) 事务 T2 从 B 帐户转入 A
8、帐户 2 万元, A=11 万元, T2 提交。(4)事务 T1 打印 A 帐户转帐后的余额,A=11 万元, T1 提交。总之,一个数据库事务中可能包含多个输入输出操作,最终结果将使数据库从一个一致性的状态变成另一个一致性的状态,即在事务执行之前或之后数据库处于一致性的状态。然而,在事务的执行期问,数据库可能暂时处于一个不一致性的状态。若在数据库不一致性状态时读取数据,就有可能产生一些问题。解决这类问题的常用方法是对所修改的对象进行封锁,实现事务的隔离性。三、锁的概念锁就是事务对某个数据库中的资源(如表和记录 )存取前,先向系统发出请求, 封锁该资源。事务获得锁后,即获得对数据的控制权。事务
9、释放它的锁之前,其它的事务不能更新此数据。当事务结束或撤消以后,释放被锁定的资源。四、锁的模式SQL Server 有两种主要的锁模式:基本锁,专用锁。1. 基本锁基本锁的模式有两种:排它锁(Exclusive Locks) ,共享锁 (Share Locks)。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 6 页 - - - - - - - - - (1) 排它锁 (X 锁),也称“写锁”排它(X) 锁可以防止并发事务对资源进行访问。其它事务不能读取或修改排它(X)
10、锁锁定的数据。使用排它锁能避免所有并发异常问题。(2)共享锁 (S 锁),也称“读锁”共享(S) 锁允许并发事务读取(SELECT) 一个资源。资源上存在共享(S) 锁时,任何其它事务都不能修改数据。一旦已经读取数据,便立即释放资源上的共享(S) 锁,除非将事务隔离级别设置为可重复读或更高级别,或者在事务生存周期内用锁定提示保留共享(S) 锁。*2. 专用锁专用锁的模式有四种:更新锁(U 锁),意向锁,架构锁,大容量更新锁。五、锁的粒度SQL Server2000 具有多粒度锁定,允许一个事务锁定不同类型的资源。为了使锁定的成本减至最少,SQL Server 自动将资源锁定在适合任务的级别。锁
11、定在较小的粒度(例如行)可以增加并发但需要较大的开销,因为如果锁定了许多行,则需要控制更多的锁。锁定在较大的粒度(例如表)就并发而言是相当昂贵的,因为锁定整个表限制了其它事务对表中任意部分进行访问,但要求的开销较低,因为需要维护的锁较少。SQL Server 可以锁定以下资源(按粒度增加的顺序列出)。资源描述RID 行标识符。用于单独锁定表中的一行。键索引中的行锁。页8 千字节(KB) 的数据页或索引页。扩展盘区相邻的八个数据页或索引页构成的一组。表包括所有数据和索引在内的整个表。数据库整个数据库。六、锁的使用1. 通过设置事务隔离级别使用锁隔离级别是一个事务必须与其它事务进行隔离的程度。较低
12、的隔离级别可以增加并发,但代价是降低数据的正确性。相反,较高的隔离级别可以确保数据的正确性,但可能对并发产生负面影响。SQL Server 支持四种事务隔离级别:隔离级别读未提交数据丢失更新不可重复读取未提交读READ UNCOMMITTED是是是提交读 READ COMMITTED否是是名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 6 页 - - - - - - - - - 可重复读REPEATABLE READ否否否可串行读SERIALIZABLE否否否2. 设置表
13、级锁当需要对对象所获得锁类型进行更精细控制时,可以使用表级锁定提示。可以使用SELECT 、INSERT、UPDATE 和 DELETE 语句指定表级的锁定类型(在语句中使用WITH () 。例:SELECT 姓名,性别 FROM 学生 WITH (NOLOCK)一般来说,读操作需要共享锁,写操作需要排它锁。在语句中可使用的“锁定提示”如下表:锁定提示描述HOLDLOCK 将共享锁保留到事务完成,而不是在相应的表、行或数据页不再需要时就立即释放锁。HOLDLOCK 等同于SERIALIZABLE 。NOLOCK 不要发出共享锁,并且不要提供排它锁。当此选项生效时,可能会读取未提交的事务或一组在
14、读取中间回滚的页面。有可能发生脏读。仅应用于 SELECT 语句。PAGLOCK 在通常使用单个表锁的地方采用页锁。READCOMMITTED 用与运行在提交读隔离级别的事务相同的锁语义执行扫描。默认情况下, SQL Server 2000 在此隔离级别上操作。READPAST 跳过锁定行。 此选项导致事务跳过由其它事务锁定的行(这些行平常会显示在结果集内),而不是阻塞该事务,使其等待其它事务释放在这些行上的锁。 READPAST 锁提示仅适用于运行在提交读隔离级别的事务,并且只在行级锁之后读取。仅适用于SELECT 语句。READUNCOMMITTED 等同于NOLOCK 。REPEATAB
15、LEREAD 用与运行在可重复读隔离级别的事务相同的锁语义执行扫描。ROWLOCK 使用行级锁,而不使用粒度更粗的页级锁和表级锁。SERIALIZABLE 用与运行在可串行读隔离级别的事务相同的锁语义执行扫描。等同于HOLDLOCK 。TABLOCK 使用表锁代替粒度更细的行级锁或页级锁。在语句结束前, SQL Server 一直持有该锁。 但是, 如果同时指定HOLDLOCK ,那么在事务结束之前,锁将被一直持有。TABLOCKX 使用表的排它锁。 该锁可以防止其它事务读取或更新表,并在语句或事务结束前一直持有。UPDLOCK 读取表时使用更新锁,而不使用共享锁, 并将锁一直保留到语句或事务
16、的结束。 UPDLOCK 的优点是允许您读取数据(不阻塞其它事务)并名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 6 页 - - - - - - - - - 在以后更新数据,同时确保自从上次读取数据后数据没有被更改。XLOCK 使用排它锁并一直保持到由语句处理的所有数据上的事务结束时。可以使用PAGLOCK 或 TABLOCK 指定该锁,这种情况下排它锁适用于适当级别的粒度。*八、监视和管理锁1. 查看事务隔离级别设置事务隔离级后,使用DBCC USEROPTIONS语
17、句查看当前的事务隔离级别。例:DBCC USEROPTIONS SET TRANSACTION ISOLATION LEVEL READ COMMITTEDDBCC USEROPTIONS 2. 使用对象资源管理器查看锁管理 /双击活动监视器3. 使用 sp_lock 报告锁的信息4. 使用 sp_who 查看用户和进程5. 设置锁定超时指定事务等待锁释放的毫秒数。下例将锁超时期限设置为1,800 毫秒。SET LOCK_TIMEOUT 1800 变量 LOCK_TIMEOUT返回当前锁超时设置,单位为毫秒。*九、死锁的预防和处理1. 死锁的概念2. 预防死锁3. 解除死锁名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 6 页 - - - - - - - - -