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

SQL सर्वर - एकाधिक क्लाइंट से तालिका में एक साथ सम्मिलित करें - सीमा जांचें और ब्लॉक करें

मुझे नहीं लगता कि यह घोषणात्मक रूप से करना संभव है।

यदि सभी प्रविष्टियों को संग्रहीत प्रक्रिया के माध्यम से जाने की गारंटी दी जाती है और एक बार डालने के बाद सेलवैल्यू अपडेट नहीं किया जाता है तो निम्नलिखित काम करना चाहिए (मैंने टेबल और कॉलम नाम बनाए क्योंकि इन्हें प्रारंभिक प्रश्न में आपूर्ति नहीं की गई थी)

DECLARE @SumSaleValue MONEY

BEGIN TRAN

SELECT @SumSaleValue = SUM(SaleValue)
FROM dbo.Orders WITH (UPDLOCK, HOLDLOCK)
WHERE TransactionId = @TransactionId

IF @SumSaleValue > 1000
    BEGIN
    RAISERROR('Cannot do insert as total would exceed order limit',16,1);
    ROLLBACK;
    RETURN;
    END

/*Code for INSERT goes here*/

COMMIT

HOLDLOCK क्रमबद्ध शब्दार्थ देता है और TransactionId . से मेल खाने वाली पूरी रेंज को लॉक कर देता है और UPDLOCK दो समवर्ती लेन-देन को एक ही सीमा को लॉक करने से रोकता है और इस प्रकार गतिरोध के जोखिम को कम करता है।

TransactionId,SaleValue . पर एक इंडेक्स इस प्रश्न का समर्थन करना सबसे अच्छा होगा।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. दशमलव गलत तरीके से C# से SQL सर्वर में TableAdapters के साथ पारित हो गया

  2. एसक्यूएल सर्वर 2008 + पीसीआई अनुपालन? पीसीआई, साथ ही सममित कुंजी से संबंधित है!

  3. CTE (रिकर्सिव) समानांतर क्यों नहीं है (MAXDOP=8)?

  4. SSMS में अनुमतियाँ समस्या:ऑब्जेक्ट 'विस्तारित_प्रॉपर्टीज', डेटाबेस 'mssqlsystem_resource' पर चयन अनुमति अस्वीकार कर दी गई थी, ... त्रुटि 229)

  5. पूरे नेटवर्क में SQL सर्वर इंस्टेंस को छिपाना