मैं प्रतिबिंबित करने के लिए कि किसी दिए गए ग्राहक सत्र रिकॉर्ड एक बहु सत्र पर्यावरण के भीतर हासिल कर ली है (और अब यह आगे के अपडेट के मालिक) एक तालिका के एक ही रिकॉर्ड को अपडेट करना चाहते हैं। मैं इस मिल गया है अब तक:परमाणु अनन्य एसक्यूएल रिकॉर्ड अद्यतन
create procedure AcquireRow(
@itemNo int, -- Item ID to acquire
@sessNo int, -- Session ID
@res char(1) out) -- Result
as
begin
-- Attempt to acquire the row
update Items
set
State = 'A', -- 'A'=Acquired
SessionID = @sessNo
where ItemID = @itemNo
and State = 'N'; -- 'N'=Not acquired
-- Verify that the session actually acquired the row
set @res = 'T'; -- 'T'=Success
if @@rowcount = 0
set @res = 'F'; -- 'F'=Failure
end;
बाहर चर @state
'T'
अगर प्रक्रिया को सफलतापूर्वक हासिल कर ली पंक्ति पर सेट किया जाता है, अन्यथा यह विफलता का संकेत करने के लिए 'F'
सेट है।
मेरा प्रश्न: इस atomically काम करने की गारंटी है, ताकि एक ही सत्र सफलतापूर्वक (नवीनीकरण) पंक्ति का अधिग्रहण कई सत्रों एक ही समय में AcquireRow()
फोन तो क्या होगा? या यह करने का एक बेहतर तरीका है? क्या मुझे एक स्पष्ट rowlock
की आवश्यकता है?
संशोधित:
Remus के जवाब के आधार पर, मैं इस प्रकार कोड को पुनर्व्यवस्थित होगा:
set @res = 'F';
update ...;
if @@rowcount > 0
set @res = 'T';
एक output
खंड का उपयोग करना या बताए जिसके परिणामस्वरूप पंक्ति के ItemID
update
भीतर एक चर को भी समझदारी होगी।
SO पर एक बहुत ही समान प्रश्न पूछा गया है, लेकिन मुझे यह नहीं मिल रहा है .... –
यह एक समान है लेकिन मेरे मन में नहीं था: http://stackoverflow.com/questions/574549/ कुशल लेनदेन-रिकॉर्ड-लॉकिंग –