保证锁是独家在桌子上阅读也

时间:2018-03-24 15:55:16

标签: sql-server-2008 tsql

我正在编写一个Web应用程序,并遇到了一个问题,即在一行中保留一个仅在两行中相同的值,并且两者都在单批执行中。我想出了一种方法来读取列中的MAX值并递增1.因此,我最终编写了锁定表的过程,以便其他用户不应该读取MAX值的脏读。

Create table D(Id int , Name varchar(100))

Begin Tran 
    DECLARE @i int = (SELECT MAX(ID) FROM D with (tablockx, holdlock))
    Print @i ;

    Insert into D values ((@i + 1), 'ANAS')

    SELECT * FROM D 

    --COMMIT 
Rollback 

此代码锁定表,直到查询提交或回滚。我有两个问题1)这个代码保证在表上有独占锁吗? 2)在我的快速阅读中 tablockx 可以帮助执行锁定读取,而 holdlock 有助于防止我在锁定会话中工作的行中的更改,但是这是正确使用的,因为我认为 holdlock 实际上可能不需要

1 个答案:

答案 0 :(得分:0)

不确定你是在问正确的问题。您需要不更改当前值且不插入。使用SERIALIZABLE,您可能不需要(updlock)。

我对这个答案并不乐观。你应该做自己的测试。

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
Begin Tran 
    DECLARE @i int = (SELECT MAX(ID) FROM D with (updlock))
    Print @i ;

    Insert into D values ((@i + 1), 'ANAS')

    SELECT * FROM D 

    --COMMIT 
Rollback

身份或序列号是更好的方法