我正在编写一个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 实际上可能不需要
答案 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
身份或序列号是更好的方法