पर वापस लौटें मुझे वास्तव में मेरे कोल्डफ्यूजन एप्लिकेशन (एमएस एसक्यूएल 2008 में समर्थित) में एक क्वेरी के साथ परेशानी हो रही है। मैं इस सौदे को पर डीबी गतिरोध त्रुटियों बार आ रही है:टीएसक्यूएल फिर एक लेनदेन में अद्यतन करें, फिर
<code>
<cftransaction>
<cfquery name="selectQuery">
SELECT TOP 20 item_id, field2, field3
FROM Table1
WHERE subject_id = #subject_ID# AND lock_field IS NULL AND
NOT EXISTS (SELECT * FROM Table2 WHERE Table2.user_ID = #user_ID# Table1.item_id = Table2.item_id)
</cfquery>
<cfquery name="updateQuery">
UPDATE Table1
SET lock_field = 1, locked_by = #user_ID#
WHERE Table1.item_id IN (#ValueList(selectQuery.item_id#)
</cfquery>
</cftransaction>
</code>
Bascially, मैं एक तालिका (Table1) जो इंतजार कर आइटम की एक बड़ी कतार का प्रतिनिधित्व करता है। उपयोगकर्ताओं को स्कोर देने के लिए "चेकआउट" आइटम। केवल एक उपयोगकर्ता को एक समय में एक आइटम चेक आउट किया जा सकता है। मुझे किसी दिए गए उपयोगकर्ता के लिए एक समय में 20 आइटमों के ब्लॉक का अनुरोध करने की आवश्यकता है। उन वस्तुओं को पहले से ही चेक आउट नहीं किया जा सकता है और उपयोगकर्ता पहले से ही उन्हें पहले से नहीं चला सकता है (इसलिए लॉक_फील्ड न्यूल है और SELECT में EXISTS कथन नहीं है)। एक बार जब मैंने 20 item_ids की सूची निर्धारित की है, तो मुझे उन्हें कतार तालिका को लॉक करने के लिए चिह्नित करने की आवश्यकता है ताकि कोई भी उन्हें एक ही समय में जांच न सके। मुझे item_ids की उस सूची को वापस करने की भी आवश्यकता है।
मैं सोच रहा था कि यह बेहतर काम कर सकता है अगर मैं इसे एक सीएफटीआरएक्शन से SQL सर्वर पक्ष में संग्रहीत प्रो में ले जाता हूं। मुझे यकीन नहीं है कि cftransaction लॉकिंग किसी भी तरह हस्तक्षेप कर रहा है। मैं एक टीएसक्यूएल गुरु नहीं हूं, इसलिए कुछ मदद की सराहना की जाएगी।
क्या आपके पास अपने अपडेट ऑपरेशन की सुरक्षा के लिए '' है? इस तरह सभी समेकन मुद्दों को दूर जाना चाहिए। –
Tomalak
अद्यतन cftransaction का हिस्सा है। मुझे यकीन नहीं है कि एक सीएफएलॉक की जरूरत है, नहीं? –
एक cftransaction केवल एक त्रुटि होने पर ही जारी किए गए प्रत्येक SQL कथन को वापस रोल करता है। यह कोड के उस खंड को लॉक नहीं करता है। – Tomalak