我有一系列需要以原子方式运行的 T-SQL 查询.(见下文)...目的是允许 1 个用户一次检索一个唯一的行,并防止其他用户同时检索同一行.
I have a series of T-SQL queries that I need to run atomically. (See Below)... The purpose is to allow 1 user to retrieve a single, unique row at a time and prevent other users from retrieving the same row simultaneously.
到目前为止,我已经看到了两种可能的解决方案.1) 表提示 (HOLDLOCK, TABLOCKX) 和 2) 事务隔离级别 (SERIALIZABLE)...
So far I have seen two possible solutions. 1) Table Hints (HOLDLOCK, TABLOCKX) and 2) Transaction Isolation Level (SERIALIZABLE)...
我的问题:
哪个选项更好?
Which option is better?
还有其他/更好的解决方案吗?
Is there another/better solution?
DECLARE @recordId int;
SELECT @recordId = MIN([id])
FROM Exceptions
WHERE [status] = 'READY';
UPDATE Exceptions
SET [status] = 'PROCESSING',
[username] = @Username
WHERE [id] = @recordId;
SELECT *
FROM Exceptions
WHERE [id] = @recordId;
在这种情况下,
这两个概念是不同的,你想要的也不是.
The 2 concepts are different and neither does what you want.
做你想做的事,避免竞争条件,需要强制一个非阻塞(READPAST)排他(UPDLOCK)行级(ROWLOCK)锁,.您还可以使用 OUTPUT 子句使其成为具有原子性的单个语句.这可以很好地扩展.
To do what you want, to avoid race conditions, you need to force a non-blocking (READPAST) exclusive (UPDLOCK) row level (ROWLOCK) lock,. You can also use the OUTPUT clause to make it a single statement that will be atomic. This scales well.
UPDATE
E
SET
[status] = 'PROCESSING', [username] = @Username
OUTPUT
INSERTED.*
FROM
(
SELECT TOP 1 id, [status], [username]
FROM Exceptions (ROWLOCK, READPAST, UPDLOCK)
WHERE [status] = 'READY'
ORDER BY id
) E
总的来说,锁有3个方面
In general, locks have 3 aspects
PAGLOCK、ROWLOCK、TABLOCK)HOLDLOCK、READCOMMITTED、REPEATABLEREAD、SERIALIZABLE)UPDLOCK, XLOCK)和
NOLOCK, TABLOCKX这篇关于TABLOCKX 与可序列化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!
将每个子标记转换为具有多个分隔符的单列-SQLConverting Every Child Tags in to a Single Column with multiple Delimiters -SQL Server (3)(将每个子标记转换为具有多个分隔符的单列-SQ
如何从多个表创建视图?How can I create a view from more than one table?(如何从多个表创建视图?)
根据前一行内的计算值创建计算值Create calculated value based on calculated value inside previous row(根据前一行内的计算值创建计算值)
如何将表格的前两列堆叠成一列,但也仅将第三How do I stack the first two columns of a table into a single column, but also pair third column with the first column only?(如何将表格的前两列堆
递归 t-sql 查询Recursive t-sql query(递归 t-sql 查询)
将月份名称转换为日期/月份编号(问题和答案的组Convert Month Name to Date / Month Number (Combinations of Questions amp; Answers)(将月份名称转换为日期/月份编号(问题和答案的组合