- 1、本文档共110页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第十一章并发控制讲述
补充1: 封锁协议 在运用X锁和S锁对数据对象加锁时,需要约定一些规则:封锁协议(Locking Protocol) 何时申请X锁或S锁 持锁时间、何时释放 不同的封锁协议,在不同的程度上为并发操作的正确调度提供一定的保证 常用的封锁协议:三级封锁协议 1级封锁协议 事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放 正常结束(COMMIT) 非正常结束(ROLLBACK) 1级封锁协议可防止丢失修改 在1级封锁协议中,如果是读数据,不需要加锁的,所以它不能保证可重复读和不读“脏”数据。 1级封锁协议 2级封锁协议 1级封锁协议+事务T在读取数据R前必须先加S锁,读完后即可释放S锁 2级封锁协议可以防止丢失修改和读“脏”数据。 在2级封锁协议中,由于读完数据后即可释放S锁,所以它不能保证可重复读。 3级封锁协议 1级封锁协议 + 事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放 3级封锁协议可防止丢失修改、读脏数据和不可重复读。 容易造成比较多的死锁 3级封锁协议 封锁协议小结 补充2:事务隔离 为了避免产生并发访问问题,SQL Server使用不同类型的锁对资源进行锁定,从而限制在一个事务读取数据期间其他事务锁执行的操作类型,即对事务进行隔离。 不同的并发访问问题可以通过设置不同的事务隔离级别加以解决。事务的隔离级别控制一个事务与其他事务的隔离程度,它决定该事务在读取数据时对资源所使用的锁类型。 3)设置事务隔离级别 调用T-SQL中的SET TRANSACTION INOLATION LEVEL语句可以调整事务的隔离级别,以控制由该连接所发出的所有SELECT语句的默认事务锁定行为。该语句的语法格式为: SET TRANSACTION ISOLATION LEVEL{ READ UNCOMMITTED |READ COMMITTED |REPEATABLE READ |SERIALIZABLE } 3)设置事务隔离级别 例如:将事务隔离级别设置为REPEATABLE READ SET TRANSACTION ISOLATION LEVEL REPEATABLE READ 注意:一旦设定,系统就会按这种隔离级别自动进行并发处理。 3)设置事务隔离级别 执行以下步骤可以使用Transact-SQL设置事务的隔离级别,模拟实现脏读: (1)在 SQL Server Management Studio 中,单击工具栏上的【新建查询】按钮,出现【…Query1.sql】窗体。 (2)在【…Query1.sql】查询窗体内输入以下代码: USE stu BEGIN TRANSACTION UPDATE students.student SET sage=23 WHERE sno=200215121 WAITFOR DELAY 00:00:10 SELECT * FROM students.student WHERE sno=200215121 ROLLBACK TRANSACTION (3)单击工具栏上的【新建查询】按钮,出现【…Query2.sql】窗体。 (4)在【…Query2.sql】查询窗体内输入以下代码: USE stu SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED BEGIN TRANSACTION SELECT * FROM students.student WHERE sno=200215121 WAITFOR DELAY 00:00:20 SELECT * FROM students.student WHERE sno=200215121 COMMIT TRANSACTION (5)切换到【…Query1.sql】窗体,单击【执行】按钮,进入事务运行状态。 (6)立即切换到【…Query2.sql】窗体,单击【执行】按钮,查看运行结果。 (7)等【…Query1.sql】窗体内的事务运行结束后,切换到【…Query2.sql】窗体,查看运行结果,分析【…Query2.sql】中的事务能否重复读。 (8)将【…Query2.sql】查询窗体内的代码改为以下代码: USE stu SET TRANSACTION ISOLATION LEVEL READ COMMITTED BEGIN TRANSACTION SELECT * FROM students.student WHERE sno=200215121 WAITFOR DELAY 00:00:20 SELECT * FROM students.student WHER
文档评论(0)