डेडलॉक्स से बचने और एकाधिक सेवाओं के अनुरोधों को सिंक्रनाइज़ करने का प्रयास करने में, मैं ROWLOCK, READPAST का उपयोग कर रहा हूं। मेरा सवाल यह है कि मुझे इसे एक प्रश्न में कहां रखना चाहिए जिसमें सीटीई, एक सबक्वायरी और सीटीई पर अपडेट स्टेटमेंट शामिल है? क्या कोई महत्वपूर्ण स्थान है या क्या तीनों स्थानों पर यह होना चाहिए (नीचे)? या हो सकता है कि ऐसी क्वेरी लिखने का एक बेहतर तरीका है ताकि मैं केवल उन पंक्तियों का चयन कर सकूं जिन्हें अपडेट किया जाएगा।ROWLOCK का उपयोग कहां करें, सीटीई, सबक्वायरी और अपडेट के साथ रीडपैस्ट?
alter proc dbo.Notification_DequeueJob
@jobs int = null
as
set nocount on;
set xact_abort on;
declare @now datetime
set @now = getdate();
if(@jobs is null or @jobs <= 0) set @jobs = 1
;with q as (
select
*,
dense_rank() over (order by MinDate, Destination) as dr
from
(
select *,
min(CreatedDt) over (partition by Destination) as MinDate
from dbo.NotificationJob with (rowlock, readpast)
) nj
where (nj.QueuedDt is null or (DATEDIFF(MINUTE, nj.QueuedDt, @now) > 5 and nj.CompletedDt is null))
and (nj.RetryDt is null or nj.RetryDt < @now)
and not exists(
select * from dbo.NotificationJob
where Destination = nj.Destination
and nj.QueuedDt is not null and DATEDIFF(MINUTE, nj.QueuedDt, @now) < 6 and nj.CompletedDt is null)
)
update t
set t.QueuedDt = @now,
t.RetryDt = null
output
inserted.NotificationJobId,
inserted.Categories,
inserted.Source,
inserted.Destination,
inserted.Subject,
inserted.Message
from q as t
where t.dr <= @jobs
go