PDA

View Full Version : چگونه مشکل هم زمانی رو حل کنیم؟



mastermehdi1
پنج شنبه 29 اردیبهشت 1390, 14:33 عصر
سلام دوستان
کد زير رو نگاه کنيد:



create procedure [proc]
as
begin
if(not exists(select * from [table] where [date] = convert(date, getdate())))
insert into [table]
([counter], [date])
values
(1, convert(date, getdate()))
else
update [table]
set [counter] += 1
where [date] = convert(date, getdate())
end


در حالت عادی اين کد درست عمل می کنه!
یعنی اگر در جدول فیلدی با تاریخ امروز وجود نداشته باشه پس یه فیلد با تاریخ امروز بهش اضافه میشه و شمارندش یک میشه در غیر اینصورت به شمارنده ی فیلدی که تاریخ امروز رو داره یک شماره اضافه میشه!

اما وقتی بطور همزمان صدها مرتبه اين تابع صدا زده بشه بلاخره چند تا درخواست با هم شرطشون صحیح شده و وارد مرحله insert میشن که این باعث میشه اولین درخواست یه سطر به جدول اضافه کنه و درخواست های بعدی تولید خطا کنن!

به نظر شما چطور میشه این مسئله رو حل کرد؟

majid_afra222
جمعه 30 اردیبهشت 1390, 20:23 عصر
سلام
باید جدول رو بصورت صریح Lock کنید، در صورتیکه که این قفل در اختیار کس دیگه ای نبود، عملیات رو انجام بدید و قفل رو رها کنید تا نفر بعدی اونرو بگیره.
باید این نکته رو هم بیان کنم که باید عملیاتی که قرار هستش در زمان Lock بودن جدول انجام بشه باید بسیار سریع و کوتاه باشه، برای اینکار بهتره بعد از اینکه نتیجه کار که بدست اومد جدول رو قفل کنید عملیات ثبت رو انجام بدید، در نهایت قفل رو رها کنید.

meisam1366
یک شنبه 01 خرداد 1390, 16:58 عصر
باید جدول رو بصورت صریح Lock کنید، در صورتیکه که این قفل در اختیار کس دیگه ای نبود، عملیات رو انجام بدید و قفل رو رها کنید تا نفر بعدی اونرو بگیره.


میتونین توضیح بدین که
1- چطوری جدول رو قفل کنیم؟
2- اگر کاربر دیگری به جدول درخواست داد و آن جدول در حالت قفل بود، چه اتفاقی میافته؟؟ (توی صف میره یا اینکه طور دیگه ای میشه؟)

.

ممنون میشم به این سوال هم جواب بدین.