PDA

View Full Version : lock کردن چند رکورد از جدول با شرط خاص تا زمانی که دستورات اجرا شود؟



explod_javad
شنبه 05 فروردین 1391, 11:10 صبح
با سلام
یک فروشگاه تحت شبکه را در نظر بگیرید که محصولاتی با محدودیت تعداد را به فروش میرساند.
مثلا یک محصول به تعداد 1 عدد موجود است و دو کاربر در حال فروش آن می باشند
چطور میشه کاری کرد که تا زمان ثبت کامل عملیات فروش توسط یکی از کاربران ، جدول محصولات به شرط مساوی بودن کد محصولات موجود در آن با کد محصول فروخته شده ، قفل شود ؟

lastmory
شنبه 05 فروردین 1391, 14:00 عصر
با سلام
چطور میشه کاری کرد که تا زمان ثبت کامل عملیات فروش توسط یکی از کاربران ، جدول محصولات به شرط مساوی بودن کد محصولات موجود در آن با کد محصول فروخته شده ، قفل شود ؟

یکی از راهها اینه
میشه یه فیلد Is_Lock بگیری تو جدول محصولات
و وقتی کاربری داره با یه کالای خاصی کار میکنه اون فیلد رو یک کنی
و وقتی کارش تموم شد ، صفرش کنی

oliya24
شنبه 05 فروردین 1391, 15:32 عصر
میشه بیشتر توضیح بدید

lastmory
شنبه 05 فروردین 1391, 16:27 عصر
توی جدول کالا یه فیلد تحت عنوان Is_Lock از نوع Bit میگیریم ،
حالا وقتی کاربر کالایی رو انتخاب میکنه برای فروش ، Is_Lock مربوط به اون کالا یک میشه
از اون طرف اگه یه کاربر دیگه بخواد همین کالا رو انتخاب کنه برای فروش چون Is_Lock ش یک هست
، با محدودیت روبرو میشه
وقتی هم که کاربر اول کارش تموم شد ، Is_Lock اون کالا رو صفر میکنیم
و کالا آزاد میشه

oliya24
شنبه 05 فروردین 1391, 17:13 عصر
مرسی از توضیحاتتون خوب الته روش دیگری هم هست استفاده از cuncurency ها میشه با این روش این مشکل روحل کرد

lastmory
شنبه 05 فروردین 1391, 17:32 عصر
مرسی از توضیحاتتون خوب الته روش دیگری هم هست استفاده از cuncurency ها میشه با این روش این مشکل روحل کرد
درسته
روشهای زیادی رو میشه برای حل این جور مسائل پیشنهاد داد
بستگی به سبک کاری
و سلیقه برنامه نویس هم داره

ali190
شنبه 05 فروردین 1391, 18:51 عصر
سلام

وی جدول کالا یه فیلد تحت عنوان Is_Lock از نوع Bit میگیریم ،
حالا وقتی کاربر کالایی رو انتخاب میکنه برای فروش ، Is_Lock مربوط به اون کالا یک میشه
از اون طرف اگه یه کاربر دیگه بخواد همین کالا رو انتخاب کنه برای فروش چون Is_Lock ش یک هست
، با محدودیت روبرو میشه
اگر برنامه کرش شد و کاربر از برنامه بیرون بیاد اون فیلد تا قیامت همونطور با محدودیت روبرو میشه
مثل بستن برنامه با Task manager و عدم اجرای مثلاً Event مربوط به Form-close
درسته؟!
یاعلی

lastmory
یک شنبه 06 فروردین 1391, 10:03 صبح
سلام

اگر برنامه کرش شد و کاربر از برنامه بیرون بیاد اون فیلد تا قیامت همونطور با محدودیت روبرو میشه
مثل بستن برنامه با Task manager و عدم اجرای مثلاً Event مربوط به Form-close
درسته؟!
یاعلی
نه دیگه ، این یکی از چیزاییه که ممکنه پیش بیاد
برنامه نویسی که از این راه میره جلو
حتما فکر اینجاشم میکنه
یه بخشی به نام قفل گشایی تو برنامه میشه اضافه کرد که این مسئله رو حل کنه
:چشمک:

baktash.n81@gmail.com
یک شنبه 06 فروردین 1391, 12:17 عصر
سلام

روش کلید IsLock باید یه شرط دیگه هم داشته باشه ... و اینکه تعداد اون کالا 1 باشه وگرنه احتیاج به قفل شدنش نیست ...

به نظر من بهتره که بزاری دونفر کار فروششون رو انجام بدن و هرکی زودتر کارو تموم کرد مقدارو صفر می کنه و نفر دوم یه پیغام مناسب دریافت می کنه ... البته یه مقدار بیشتر توضیح بدید که برنامه دقیقا قراره چه کاری انجام بده ...

lastmory
یک شنبه 06 فروردین 1391, 13:12 عصر
سلام

روش کلید IsLock باید یه شرط دیگه هم داشته باشه ... و اینکه تعداد اون کالا 1 باشه وگرنه احتیاج به قفل شدنش نیست ...


با Is_Lock اگه قفل شه جدول محصولات
فکر نمیکنم به این شرط هم نیازی داشته باشیم
ممکنه از یه کالا 3 تا داشته باشیم
کاربر اول 1 عدد از اون کالا رو بفروشه و کاربر دوم همزمان 3 عدد از اون کالا رو بفروشه ، اینجوری اگه این شرط رو لحاظ کنیم برای قفل کردن ، دچار اشتباه میشیم
اما اگه از همون اول قفل کنیم اون کالارو ، این مشکل رو نداریم
منطق اینه که کاربر دوم صبر کنه تا کاربر اول تکلیف اون کالا رو روشن کنه

baktash.n81@gmail.com
دوشنبه 07 فروردین 1391, 07:50 صبح
با Is_Lock اگه قفل شه جدول محصولات
فکر نمیکنم به این شرط هم نیازی داشته باشیم
ممکنه از یه کالا 3 تا داشته باشیم
کاربر اول 1 عدد از اون کالا رو بفروشه و کاربر دوم همزمان 3 عدد از اون کالا رو بفروشه ، اینجوری اگه این شرط رو لحاظ کنیم برای قفل کردن ، دچار اشتباه میشیم
اما اگه از همون اول قفل کنیم اون کالارو ، این مشکل رو نداریم
منطق اینه که کاربر دوم صبر کنه تا کاربر اول تکلیف اون کالا رو روشن کنه

اینکه دیگه کاملا خارج از منطق اگه از به کالا 1000 تا داشته باشیم و یه نفر بخواد یکیشو بفروشه ... بقیه نمی تونن بفروشن ... منطقیه به نظرت ؟؟؟

explod_javad
دوشنبه 07 فروردین 1391, 09:32 صبح
سلام
دوستان نظرات خوبی ارائه کردند ولی به نظر من روش های مطرح شده منطقی نیست.
پیشنهاد من استفاده از کد زیر هست


BEGIN TRAN CandidateSale

این کوئری رکورد کالای مورد نظر را قفل میکند ولی میشه اونو خوند (Select)
SELECT * FROM Tbl_Product WITH (UPDLOCK)
WHERE ProductNumber = 123456

در این قسمت از موجودی کالا تعداد محصول فروخته شده کم میشود
(update Tbl_Product set Mojoodi=(Mojoodi-1
WHERE ProductNumber = 123456

در این قسمت هم اطلاعات مربوط به رکورد قفل شده نمایش داده میشود. که البته میشه حذفش کنید.
SELECT resource_type, request_mode, resource_description
FROM sys.dm_tran_locks
WHERE resource_type <> 'DATABASE'
WAITFOR DELAY '00:00:11'



COMMIT TRANSACTION CandidateSale
بعد از پایان این کوئری رکرود مورد نظر آزاد میشود