深入分析mssql数据库中事务隔离级别和锁机制

上传人:bin****86 文档编号:59392367 上传时间:2018-11-07 格式:DOCX 页数:8 大小:18.31KB
返回 下载 相关 举报
深入分析mssql数据库中事务隔离级别和锁机制_第1页
第1页 / 共8页
深入分析mssql数据库中事务隔离级别和锁机制_第2页
第2页 / 共8页
深入分析mssql数据库中事务隔离级别和锁机制_第3页
第3页 / 共8页
深入分析mssql数据库中事务隔离级别和锁机制_第4页
第4页 / 共8页
深入分析mssql数据库中事务隔离级别和锁机制_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《深入分析mssql数据库中事务隔离级别和锁机制》由会员分享,可在线阅读,更多相关《深入分析mssql数据库中事务隔离级别和锁机制(8页珍藏版)》请在金锄头文库上搜索。

1、我真正系统地接触和学习党的基本知识是在这次中级党校的培训班上。通过学习,了解了党的发展历程,对党的性质、宗旨、任务等基本知识有了进一步的了解深入分析MSSQL数据库中事务隔离级别和锁机制锁机制NOLOCK和READPAST的区别。1. 开启一个事务执行插入数据的操作。?12345 BEGIN TRAN t INSERT INTO Customer SELECT a,a2. 执行一条查询语句。?1 SELECT * FROM Customer WITH (NOLOCK)结果中显示”a”和”a”。当1中事务回滚后,那么a将成为脏数据。(注:1中的事务未提交) 。NOLOCK表明没有对数据表添加共享

2、锁以阻止其它事务对数据表数据的修改。?1 SELECT * FROM Customer这条语句将一直死锁,直到排他锁解除或者锁超时为止。(注:设置锁超时SET LOCK_TIMEOUT 1800)?1 SELECT * FROM Customer WITH (READPAST)这条语句将显示a未提交前的状态,但不锁定整个表。这个提示指明数据库引擎返回结果时忽略加锁的行或数据页。3. 执行一条插入语句。? BEGIN TRAN t INSERT INTO Customer SELECT b,b COMMIT TRAN t这个时候,即使步骤1的事务回滚,那么a这条数据将丢失,而b继续插入数据库中。

3、NOLOCK1 执行如下语句。? BEGIN TRAN ttt SELECT * FROM Customer WITH (NOLOCK) WAITFOR delay 00:00:20 COMMIT TRAN ttt注:NOLOCK不加任何锁,可以增删查改而不锁定。? INSERT INTO Customer SELECT a,b 不锁定 DELETE Customer where ID=1 不锁定 SELECT * FROM Customer 不锁定 UPDATE Customer SET Title=aa WHERE ID=1 不锁定ROWLOCK1. 执行一条带行锁的查询语句。? SET

4、TRANSACTION ISOLATION LEVEL REPEATABLE READ - (必须) BEGIN TRAN ttt SELECT * FROM Customer WITH (ROWLOCK) WHERE ID=17 WAITFOR delay 00:00:20 COMMIT TRAN ttt注:在删除和更新正在查询的数据时,会锁定数据。对其他未查询的行和增加,查询数据无影响。?11 INSERT INTO Customer SELECT a,b 不等待 DELETE Customer where ID=17 等待 DELETE Customer where ID17 不等待 S

5、ELECT * FROM Customer 不等待 UPDATE Customer SET Title=aa WHERE ID=17等待 UPDATE Customer SET Title=aa WHERE ID17不等待HOLDLOCK,TABLOCK和TABLOCKX1. 执行HOLDLOCK? BEGIN TRAN ttt SELECT * FROM Customer WITH (HOLDLOCK) WAITFOR delay 00:00:10 COMMIT TRAN ttt注:其他事务可以读取表,但不能更新删除update Customer set Title=aa 要等待10秒中。S

6、ELECT * FROM Customer 不需要等待2. 执行TABLOCKX? BEGIN TRAN ttt SELECT * FROM Customer WITH (TABLOCKX) WAITFOR delay 00:00:10 COMMIT TRAN ttt注:其他事务不能读取表,更新和删除update Customer set Title=aa 要等待10秒中。SELECT * FROM Customer 要等待10秒中。3. 执行TABLOCK? BEGIN TRAN ttt SELECT * FROM Customer WITH (TABLOCK) WAITFOR delay

7、00:00:10 COMMIT TRAN ttt注:其他事务可以读取表,但不能更新删除update Customer set Title=aa 要等待10秒中。SELECT * FROM Customer 不需要等待UDPLOCK1. 在A连接中执行。? BEGIN TRAN ttt SELECT * FROM Customer WITH (UPDLOCK) WAITFOR delay 00:00:10 COMMIT TRAN ttt2. 在其他连接中执行。update Customer set Title=aa where ID=1要等10秒SELECT * FROM Customer 不用

8、等insert into Customer select a,b不用等注:对于UDPLOCK锁,只对更新数据锁定。注:使用这些选项将使系统忽略原先在SET语句设定的事务隔离级别(SET Transaction Isolation Level)。事务隔离级别脏读:READ UNCOMMITTED脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。1. 在A连接中执行。? BEGIN TRAN t IN

9、SERT INTO Customer SELECT 123,123 WAITFOR delay 00:00:20 COMMIT TRAN t2. 在B连接中执行。?123 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED SELECT * FROM Customer这个时候,未提交的数据会123会显示出来,当A事务回滚时就导致了脏数据。相当于(NOLOCK)提交读:READ COMMITTED1. 在A连接中执行。? BEGIN TRAN t INSERT INTO Customer SELECT 123,123 WAITFOR delay 00

10、:00:20 COMMIT TRAN t2. 在B连接中执行。?123 SET TRANSACTION ISOLATION LEVEL READ COMMITTED SELECT * FROM Customer这个时候,未提交的数据会123不会显示出来,当A事务提交以后B中才能读取到数据。避免了脏读。不可重复读:REPEATABLE READ不可重复读是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此

11、称为是不可重复读。例如:1. 在A连接中执行如下语句。?11 SET TRANSACTION ISOLATION LEVEL REPEATABLE READ BEGIN TRAN ttt SELECT * FROM Customer WHERE ID=17 WAITFOR delay 00:00:30 SELECT * FROM Customer WHERE ID=17 COMMIT TRAN ttt2. 在B连接中执行如下语句,而且要在第一个事物的三十秒等待内。UPDATE Customer SET Title=d WHERE ID=17这个时候,此连接将锁住不能执行,一直等到A连接结束为止

12、。而且A连接中两次读取到的数据相同,不受B连接干扰。注,对于Read Committed和Read UnCommitted情况下,B连接不会锁住,等到A连接执行完以后,两条查询语句结果不同,即第二条查询的Title变成了d。序列化读:SERIALIZABLE1. 在A连接中执行。? SET TRANSACTION ISOLATION LEVEL SERIALIZABLE BEGIN TRAN t UPDATE Customer SET Title=111 WAITFOR delay 00:00:20 COMMIT TRAN t2. 在B连接中执行,并且要在A执行后的20秒内。? BEGIN T

13、RAN tt INSERT INTO Customer SELECT 2,2 COMMIT TRAN tt在A连接的事务提交之前,B连接无法插入数据到表中,这就避免了幻觉读。注:幻觉读是指当事务不是独立执行时发生的一种现象,例如 第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好像发生了幻觉一样。共享锁共享锁(S 锁)允许并发事务在封闭式并发控制(请参阅并发控制的类型)下读取 (SELECT) 资源。资源上存在共享锁(S 锁)时,任何

14、其他事务都不能修改数据。读取操作一完成,就立即释放资源上的共享锁(S 锁),除非将事务隔离级别设置为可重复读或更高级别,或者在事务持续时间内用锁定提示保留共享锁(S 锁)。更新锁更新锁(U 锁)可以防止常见的死锁。在可重复读或可序列化事务中,此事务读取数据 获取资源(页或行)的共享锁(S 锁),然后修改数据 此操作要求锁转换为排他锁(X 锁)。如果两个事务获得了资源上的共享模式锁,然后试图同时更新数据,则一个事务尝试将锁转换为排他锁(X 锁)。共享模式到排他锁的转换必须等待一段时间,因为一个事务的排他锁与其他事务的共享模式锁不兼容;发生锁等待。第二个事务试图获取排他锁(X 锁)以进行更新。由于

15、两个事务都要转换为排他锁(X 锁),并且每个事务都等待另一个事务释放共享模式锁,因此发生死锁。若要避免这种潜在的死锁问题,请使用更新锁(U 锁)。一次只有一个事务可以获得资源的更新锁(U 锁)。如果事务修改资源,则更新锁(U 锁)转换为排他锁(X 锁)。排他锁排他锁(X 锁)可以防止并发事务对资源进行访问。使用排他锁(X 锁)时,任何其他事务都无法修改数据;仅在使用 NOLOCK 提示或未提交读隔离级别时才会进行读取操作。数据修改语句(如 INSERT、UPDATE 和 DELETE)合并了修改和读取操作。语句在执行所需的修改操作之前首先执行读取操作以获取数据。因此,数据修改语句通常请求共享锁和排他锁。例如,UPDATE 语句可能根据与一个表的联接修改另一个表中的行。在此情况下,除了请求更新行

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 总结/报告

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号