تبلیغات
لذت برنامه نویسی - قفل کردن یک Row خاص در زمان update جدول در SQL

جستجو

 

قفل کردن یک Row خاص در زمان update جدول در SQL

دوشنبه 25 مرداد 1389   05:31 ب.ظ


نوع مطلب : SQL Server ،T-SQL ،

نمی دونم تا حالا براتون پیش اومده بخواید یک row از جدول بانک اطلاعاتی خود را درلحظه update اطلاعات قفل کنید تا از دسترسی همزمان چند task در یک زمان جلوگیری بشه ، برای مثال فرض کنید شماره تحت عنوان شماره سفارش و یا فاکتور دارید که و می خواید بر اساس فرمول خاصی در یک لحظه اون رو بروز کنید ، مثلاً فرض کنیم که می خواهیم آخرین شماره فاکتور رو در دیتابیس دخیره کنیم و در هر بار فراخوانی Stored Procedure مقدار جاری شماره فاکتور بروز شود (امکان داره در صورتیکه تعداد زیاد درخواست بحث همزمانی پیش بیاد) برای جلوگیری از بروز مشکل با استفاده از دستور زیر یک Row خاص از جدول را با توجه به شرط "مشخص" قفل کرده و سپس اطلاعات دلخـــواه را بروز می کنیم .


ALTER PROCEDURE [dbo].[sp_GenerateInvoiceNumber]
AS
BEGIN

DECLARE @InvoiceNum Bigint
SET @InvoiceNum = 0
SET @InvoiceNum = (
Select SUM(LastInvoiceNumber) 
From TblShoppingSetting WITH (HOLDLOCK, ROWLOCK)
WHERE ID = 0 )

SET @InvoiceNum = CONVERT(bigint,@InvoiceNum) + 1
UPDATE  TblShoppingSetting
       SET  LastInvoiceNumber= @InvoiceNum
WHERE   ID = 0

Return @InvoiceNum

END

توضیح :

1 . در این Stored Procedure ابتدا یک row خاص رو با دستور SELECT و با شرطی خاص انتخاب کردیم  

2.  با استفاده از این دستور  (WITH (HOLDLOCK, ROWLOCK)) رکورد مورد نظر را قفل می کنیم .

3. و در آخر رکورد مورد نظر رو Update می کنیم .

4. با استفاده از این کد امکان اینکه همزمان چند Task در یک لحظه اطلاعات موردنظر رو بروز کند وجود ندارد و مطمئن خواهیم بود که  مقدار برگشتی (@InvoiceNum) منحصربفرد خواهد بود.


نوشته شده توسط : پژمان رودخانه یی