共享锁+行锁防止其他事务对指定行同时更新

日期:2020-04-29编辑作者:数据库

锁机制NOLOCK和READPAST的区别。

 

  1. 开启一个事务执行插入数据的操作。

    BEGIN TRAN tINSERT INTO CustomerSELECT 'a','a'

  2. 执行一条查询语句。

    SELECT * FROM Customer WITH (NOLOCK)

1、HOLDLOCK

结果中显示”a”和”a”。当1中事务回滚后,那么a将成为脏数据。(注:1中的事务未提交) 。NOLOCK表明没有对数据表添加共享锁以阻止其它事务对数据表数据的修改。

其他事务可以读取,但不能更新删除

SELECT * FROM Customer

BEGIN TRAN
SELECT * FROM ceb_Area WITH(ROWLOCK,HOLDLOCK) where ID=1--行锁

这条语句将一直死锁,直到排他锁解除或者锁超时为止。(注:设置锁超时SET LOCK_TIMEOUT 1800)

SELECT * FROM ceb_Area WITH(TABLOCK,HOLDLOCK) where ID=1--表锁

SELECT * FROM Customer WITH (READPAST)

WAITFOR DELAY '00:00:10'
COMMIT TRAN;  

这条语句将显示a未提交前的状态,但不锁定整个表。这个提示指明数据库引擎返回结果时忽略加锁的行或数据页。

 

  1. 执行一条插入语句。

    BEGIN TRAN tINSERT INTO CustomerSELECT 'b','b'COMMIT TRAN t

2、TABLOCKX

这个时候,即使步骤1的事务回滚,那么a这条数据将丢失,而b继续插入数据库中。

其他事务不能读取表,更新和删除

NOLOCK

BEGIN TRAN
SELECT COUNT(0) FROM ceb_P_Loan WITH(TABLOCKX) WHERE DATEDIFF(d,CreateTime,'2013-12-2')=0
WAITFOR DELAY '00:00:10'
COMMIT TRAN;  

1. 执行如下语句。

 

BEGIN TRAN tttSELECT * 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 –不锁定

ROWLOCK

  1. 执行一条带行锁的查询语句。

    SET TRANSACTION ISOLATION LEVEL REPEATABLE READ -- (必须)BEGIN TRAN tttSELECT www.129028.com金沙,* FROM Customer WITH (ROWLOCK) WHERE ID=17WAITFOR delay '00:00:20'COMMIT TRAN ttt

注:在删除和更新正在查询的数据时,会锁定数据。对其他未查询的行和增加,查询数据无影响。

INSERT INTO Customer SELECT 'a','b' –不等待DELETE Customer where ID=17 –等待DELETE Customer where ID17 –不等待SELECT * FROM Customer –不等待UPDATE Customer SET Title='aa' WHERE ID=17–等待UPDATE Customer SET Title='aa' WHERE ID17–不等待

HOLDLOCK,TABLOCK和TABLOCKX

  1. 执行HOLDLOCK

    BEGIN TRAN tttSELECT * FROM Customer WITH (HOLDLOCK)WAITFOR delay '00:00:10'COMMIT TRAN ttt

注:其他事务可以读取表,但不能更新删除

update Customer set Title='aa' —要等待10秒中。

本文由www.129028.com金沙发布于数据库,转载请注明出处:共享锁+行锁防止其他事务对指定行同时更新

关键词:

SQL Server 2000的安全配置

SQLserver2000数据库应用非常广泛,一旦出现安全问题,造成的损失往往难以估量!应提前预防,防患于未然。这里,我...

详细>>

如何查看某个查询用了多少TempDB空间www.129028.com金沙

DECLARE @read BIGINT, @write BIGINT; SELECT @read = SUM(num_of_bytes_read), @write = SUM(num_of_bytes_written) FROM tempdb.sys.database_files AS DBFJOI...

详细>>

浅析SQL语句中GROUP BY的用法

GROUP BY 是分组查询, 一般 GROUP BY 是和 聚合函数配合使用,你可以想想 你用了GROUP BY 按 ITEM.ITEMNUM这个字段分组,那其他字...

详细>>

微软总是试图使它的软件安装尽可能地简单顺www.129028.com金沙

如果你没有特意记录安装日期,那么有没有办法从SQL Server里查询到呢?想想我们在安装的时候,肯定会有Windows认证登...

详细>>