Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

एक संग्रहीत कार्यविधि में TSQL परस्पर अनन्य पहुँच

SERIALIZABLE लॉक करने के लिए एक अलगाव स्तर है, न कि semaphore

यह इस मामले में काम नहीं करेगा, आपको बस इतना करना होगा कि TXN के अंत तक एक रीड लॉक बना रहे जो किसी अन्य प्रक्रिया को कोड रीडिंग में नहीं रोकता है।

आपको sp_getapplock का उपयोग करना होगा लेन-देन मोड में। आप इसे प्रतीक्षा करने के लिए कॉन्फ़िगर कर सकते हैं, तुरंत बम आदि:आप पर निर्भर करता है

यह मेरे टेम्पलेट पर आधारित है TRY CATCH ROLLBACK पैटर्न वाली नेस्टेड संग्रहीत कार्यविधियाँ?

ALTER PROCEDURE get_code 
AS
SET XACT_ABORT, NOCOUNT ON

DECLARE @starttrancount int, @result int;

BEGIN TRY
    SELECT @starttrancount = @@TRANCOUNT

    IF @starttrancount = 0 BEGIN TRANSACTION

    EXEC @result = sp_getapplock 'get_code', 'Exclusive', 'Transaction', 0 
    IF @result < 0
        RAISERROR('INFO: One at a time please`!', 16, 1);

    [...Perform work...]


    IF @starttrancount = 0 
        COMMIT TRANSACTION
    ELSE
        EXEC sp_releaseapplock 'get_code';
END TRY
BEGIN CATCH
    IF XACT_STATE() <> 0 AND @starttrancount = 0 
        ROLLBACK TRANSACTION
    RAISERROR [rethrow caught error using @ErrorNumber, @ErrorMessage, etc]
END CATCH
GO


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर का उपयोग करके varchar कॉलम में गैर-ASCII वर्ण खोजें

  2. किसी अन्य तालिका परिणाम के आधार पर अपडेट करें

  3. SQL सर्वर पूर्ण पाठ खोज अग्रणी वाइल्डकार्ड

  4. एसक्यूएल सर्वर डेटाबेस में प्राथमिक कुंजी बाधा के साथ या बिना सभी टेबल कैसे प्राप्त करें - एसक्यूएल सर्वर/टीएसक्यूएल ट्यूटोरियल 59

  5. फ़ंक्शन का उपयोग करके दो तिथियों के बीच तिथियों की सूची प्राप्त करें