मुझे नहीं लगता कि यह घोषणात्मक रूप से करना संभव है।
यदि सभी प्रविष्टियों को संग्रहीत प्रक्रिया के माध्यम से जाने की गारंटी दी जाती है और एक बार डालने के बाद सेलवैल्यू अपडेट नहीं किया जाता है तो निम्नलिखित काम करना चाहिए (मैंने टेबल और कॉलम नाम बनाए क्योंकि इन्हें प्रारंभिक प्रश्न में आपूर्ति नहीं की गई थी)
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
. पर एक इंडेक्स इस प्रश्न का समर्थन करना सबसे अच्छा होगा।