PDA

View Full Version : نحوه قفل کردن Record و Table؟



SYNDROME
یک شنبه 22 مهر 1386, 17:10 عصر
با سلام
چند سوال داشتم که خواستم در این تاپیک مطرح کنم.
دلیل مطرح کردن این چند سوال در یک تاپیک این است که از یک نوع و برای پیش بردن یک هدف است.
می می خواهم یک Record و یا یک Table را قفل کنم که کسی نتواند اطلاعات آن را تغییر بدهد.
من از دستور زیر استفاده می کنم.


Select No From Tbl_Test With (TabLockX) Where ID =1

می خواهم رکوردی را که ID آن برابر 1 است قفل کنم ولی کل Tbl_Test قفل می شود.
آیا دستور بالا درست است؟
1-برای قفل کردن و باز کردم قفل یک جدول باید چه کدی بنویسم؟
2-برای قفل کردن و باز کردن قفل یک رکورد که کلیه رکوردهای دیگر قابل ویرایش باشد و فقط رکورد قفل شده تغییر نکند؟
3-آیا دستوری است که مشخص کند رکورد مثلا X قفل است یا نه ؟
ممنوم می شوم بنده را راهنمایی کنید.
با تشکر فراوان

AminSobati
یک شنبه 22 مهر 1386, 20:52 عصر
begin tran
select * from mytab with(xlock,holdlock) where col=1
-- do your work....
commit tran



تا زمانیکه Transaction باز هستش، رکورد هم Exclusive Lock داره. این رو توجه کنین که Lock انواع مختلف داره مثل Shared یا Exclusive یا Update ...
هر Lock ویژگیهای خاصی داره. فرضا Shared جلوی ویرایش دیگران رو میگیره اما جلوی Select رو نه. در حالیکه Exclusive حتی Select دیگران رو هم Block میکنه.
اگر هدفتون این هست که فرضا وقتی یک کاربر در سمت Application یک رکورد رو تحت ویرایش میبره، دیگران نتونن ویرایش انجام بدن، باید بگم کار خیلی راحت نیست. مگر اینکه Connection از سمت Client باز بمونه.
دیدن این تاپیک خالی از لطف نیست:
http://www.barnamenevis.org/forum/showthread.php?t=66789

SYNDROME
دوشنبه 23 مهر 1386, 21:35 عصر
واقعا نکاتی که گفتید خیلی جالب بود.


مثل Shared یا Exclusive یا Update ...
هر Lock ویژگیهای خاصی داره. فرضا Shared جلوی ویرایش دیگران رو میگیره اما جلوی Select رو نه. در حالیکه Exclusive حتی Select دیگران رو هم Block میکنه.

اگر امکان دارد یک مثال از روشهایی که در بالا گفتید(Shared ، Exclusive ،Update ) بزنید ممنون می شوم.
با تشکر فراوان

AminSobati
سه شنبه 24 مهر 1386, 00:55 صبح
خوب، یک Connection باز کنین و بنویسین:


set tran isolation level repeatable read

use northwind
go
begin tran
select * from customers where customerid='alfki'


و در یک Connection دیگه:



update customers set companyname=companyname+' NEW'
where customerid='alfki'


دستور Update انجام نمیشه و کاربر در حالت Block باقی میمونه. به این دلیل که کاربر اول توسط Repeatable Read روی رکورد Shared Lock گذاشته و اجازه نمیده کاربر دوم Exclusive Lock بگذاره. وقتی کاربر اول Commit یا Rollback کنه، کاربر دوم کارش ادامه پیدا میکنه