欢迎来到天天文库
浏览记录
ID:12631471
大小:37.50 KB
页数:5页
时间:2018-07-18
《数据库中的锁机制》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、锁机制NOLOCK和READPAST的区别。1.开启一个事务执行插入数据的操作。BEGINTRANtINSERTINTOCustomerSELECT'a','a'2.执行一条查询语句。SELECT*FROMCustomerWITH(NOLOCK)结果中显示”a”和”a”。当1中事务回滚后,那么a将成为脏数据。(注:1中的事务未提交)。NOLOCK表明没有对数据表添加共享锁以阻止其它事务对数据表数据的修改。SELECT*FROMCustomer这条语句将一直死锁,直到排他锁解除或者锁超时为止。(注:设
2、置锁超时SETLOCK_TIMEOUT1800)SELECT*FROMCustomerWITH(READPAST)这条语句将显示a未提交前的状态,但不锁定整个表。这个提示指明数据库引擎返回结果时忽略加锁的行或数据页。3.执行一条插入语句。BEGINTRANtINSERTINTOCustomerSELECT'b','b'COMMITTRANt这个时候,即使步骤1的事务回滚,那么a这条数据将丢失,而b继续插入数据库中。NOLOCK1.执行如下语句。BEGINTRANtttSELECT*FROMCusto
3、merWITH(NOLOCK)WAITFORdelay'00:00:20'COMMITTRANttt注:NOLOCK不加任何锁,可以增删查改而不锁定。INSERTINTOCustomerSELECT'a','b'–不锁定DELETECustomerwhereID=1–不锁定SELECT*FROMCustomer–不锁定UPDATECustomerSETTitle='aa'WHEREID=1–不锁定ROWLOCK1.执行一条带行锁的查询语句。SETTRANSACTIONISOLATIONLEVELRE
4、PEATABLEREAD--(必须)BEGINTRANtttSELECT*FROMCustomerWITH(ROWLOCK)WHEREID=17WAITFORdelay'00:00:20'COMMITTRANttt注:在删除和更新正在查询的数据时,会锁定数据。对其他未查询的行和增加,查询数据无影响。INSERTINTOCustomerSELECT'a','b'–不等待DELETECustomerwhereID=17–等待DELETECustomerwhereID<>17–不等待SELECT*FROM
5、Customer–不等待UPDATECustomerSETTitle='aa'WHEREID=17–等待UPDATECustomerSETTitle='aa'WHEREID<>17–不等待HOLDLOCK,TABLOCK和TABLOCKX1.执行HOLDLOCKBEGINTRANtttSELECT*FROMCustomerWITH(HOLDLOCK)WAITFORdelay'00:00:10'COMMITTRANttt注:其他事务可以读取表,但不能更新删除updateCustomersetTitle
6、='aa'—要等待10秒中。SELECT*FROMCustomer—不需要等待2.执行TABLOCKXBEGINTRANtttSELECT*FROMCustomerWITH(TABLOCKX)WAITFORdelay'00:00:10'COMMITTRANttt注:其他事务不能读取表,更新和删除updateCustomersetTitle='aa'—要等待10秒中。SELECT*FROMCustomer—要等待10秒中。3.执行TABLOCKBEGINTRANtttSELECT*FROMCustom
7、erWITH(TABLOCK)WAITFORdelay'00:00:10'COMMITTRANttt注:其他事务可以读取表,但不能更新删除updateCustomersetTitle='aa'—要等待10秒中。SELECT*FROMCustomer—不需要等待UDPLOCK1.在A连接中执行。BEGINTRANtttSELECT*FROMCustomerWITH(UPDLOCK)WAITFORdelay'00:00:10'COMMITTRANttt2.在其他连接中执行。updateCustomers
8、etTitle='aa'whereID=1—要等10秒SELECT*FROMCustomer–不用等insertintoCustomerselect'a','b'–不用等注:对于UDPLOCK锁,只对更新数据锁定。注:使用这些选项将使系统忽略原先在SET语句设定的事务隔离级别(SETTransactionIsolationLevel)。事务隔离级别脏读:READUNCOMMITTED脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中
此文档下载收益归作者所有