PDA

View Full Version : قفل کردن رکورد در حال اجرا در شبکه



mehdi_522
پنج شنبه 03 اردیبهشت 1388, 16:57 عصر
با سلام به دوستان عزیز
من میخواستم بپرسم چه طور میشه که در یک برنامه که تحت شبکه با سی شارپ نوشتم رکوردی که توسط کاربر فعلی هست قفل بشه و تا زمانی که کاربر با این رکورد کار میکنه کسی نتونه با کار کنه
دیتا بیس در اس کیو است

meysam_pro
جمعه 04 اردیبهشت 1388, 08:51 صبح
خود MSDE این کار رو میکنه.

prankster
جمعه 04 اردیبهشت 1388, 09:30 صبح
این کار اصلا پیشنهاد نمی شود! در برنامه های تحت شبکه برای پرهیز از کار همزمان کاربر ها بر روی یک رکورد اولین چیزی که به ذهن می رسد قفل کردن رکورد است که از طریق قفل کردن جدول و یا toggle کردن یک فیلد از جنس bit قابل اجرا است. اما مشکل اینجاست که چه هنگامی باید رکورد از حالت قفل شده خارج شود؟!
برنامه همیشه کاملا درست با سناریو های از پیش تعین شده پیش نمی رود. مثلا امکان دارد برنامه hang کند، یا کامپیوتری که به سرور متصل است به هر دلیل reset شود یا اصلا ارتباط با شبکه به صورت نرم افزاری یا سخت افزاری قطع شود، در این صورت برنامه هیچ گاه فرصت unlock کردن رکورد در database را پیدا نمی کند!
روش های متفاوتی برای handle کردن شرایطی که چند کاربر بر روی یک رکورد کار می کنند وجود دارد، مثل استفاده از socket ها و روش subscrbe کردن کاربر در شبکه های داخلی، یا روش TimeOut برای استفاده از یک رکورد. شخصا استفاده از versioning برای رکورد ها در Database را ترجیح می دهم، به این صورت که هر رکورد شامل فیلد version است که با هر بار تغییر به روز می شود. هنگام ذخیره تغییرات اگر version رکورد در database با version رکوردی که ذخیره می شود متفاوت باشد به این معنی است که رکورد توسط شخص دیگری تغییر کرده است

amironline
پنج شنبه 18 تیر 1388, 06:51 صبح
استفاده از version روش خوبي هست
لطفا در مورد استفاده از socket و روش subscribe يكم توضيح بدين

majid325
جمعه 19 تیر 1388, 17:36 عصر
دوستمون جواب خوبی دادن ولی مشکلی که در روش version هست اینه که ممکنه سناریو به این صورت باشه :
فرض کنید که برنامه وقت دهی در یک بیمارستان...
کاربر فرم وقت دهی رو باز میکنه و اولین وقت خالی رو به بیمار پیشنها میده ، انوقت بیمار قبول میکنه و کاربر اطلاعات بیمار رو وارد میکنه و میخواد ثبت کنه که .... از شانس بدش همزمانی اتفاق میافته (حالا اگه متوجه هم زمانی هم بشیم فاییده ای نداره)، حالا بیمار هم که وقت رو ok کرده و رفته.
فکر میکنم بهترین راه استفاده از socket programing و یا wcf و Remoting از این قبل متد هاست.
در کل اگه لایه میانی رو در یک ایستگاه نصب کنیم ، میتونیم خیلی راحت و بدون فشار بر روی sqlServer از ماهیت data هامون دفاع کنیم و Validation رو در تمام کلاینت ها مشترک انجام بدیم.

ASKaffash
شنبه 20 تیر 1388, 11:17 صبح
سلام
دوستان در موارد خاص روش قفل کردن رکورد روش مناسبی است در این حالت سریعا رکورد Lock شده و پس از اتمام کار UnLock میشود در ضمن هنگام قطعی و هنگ و ... پس از مدتی Lock آزاد میشود(حتما امتحان کنید)


Set Tran Isolation Level Serializable
Begin Tran
Select * From Users With (RowLock) Where UserID=...
]

majid325
دوشنبه 22 تیر 1388, 22:46 عصر
کلا باید فقط در زمان انتخاب سریع از select بدون قفل استفاده کرد.(dirty select)
بقیه موار نیاز به قفل گزاری داره ، که خود قفل گزاری و انتخاب انواع اون برای case مورد نظر نیاز به تجربه بالا داره .ولی به نظر بنده مسئله همزمانی داده ها باید قبل از sql تشخیص داده بشه.

Jean Reno
چهارشنبه 24 شهریور 1389, 13:04 عصر
می شه از Transaction استفاده کرد

Rezahak
یک شنبه 28 شهریور 1389, 11:51 صبح
با سلام
لطفا در خصوص Socket programin ، wcf و Remoting بیشتر توضیح دهید

Rezahak
یک شنبه 28 شهریور 1389, 12:05 عصر
فرض کنید که برنامه وقت دهی در یک بیمارستان...
کاربر فرم وقت دهی رو باز میکنه و اولین وقت خالی رو به بیمار پیشنها میده ، انوقت بیمار قبول میکنه و کاربر اطلاعات بیمار رو وارد میکنه و میخواد ثبت کنه که .... از شانس بدش همزمانی اتفاق میافته (حالا اگه متوجه هم زمانی هم بشیم فاییده ای نداره)، حالا بیمار هم که وقت رو ok کرده و رفته.


دلیل نداره در این خصوص پس از ثبت مشخصات کار از کار بگذرد!!!!
برای حل این مشکل دو راه حل وجود دارد :
1 - قبل از تکمیل مشخصات وقت داده شده به صورت غیر قطعی (فقط به صورت پیشنهاد) اختصاص می یابد و پس از تکمیل تمام مراحل قطعی می شود یعنی مثلا بیمار نباید توقع داشته باشد وقتی که در ابتدای مراجعه به وی پیشنهاد می شود در انتها نیز به طور قطعی به او اختصاص یابد(حالت رقابتی)
2 - مقادیر غیر قطعی به یک جدول موقت انتقال داده می شوند و براساس این که کاربر حداکثر چقدر زمان لازم دارد تا کلیه مراحل را طی کند و مقدار غیر قطعی تبدیل به قطعی شود یک زمان یا rank به رکورد مزبور اختصاص داده می شود. اگر کاربر دیگری مراجعه نمود اول جدول حاوی مقادیر غیر قطعی چک می شود و از بین رکورد هایی که حداکثر زمان آنها گذشته است یک رکورد به وی اختصاص داده می شود (حالت ثابت با در نظر گرفتن حداکثر زمان در دست داشتن token)