با سلام به دوستان عزیز
من میخواستم بپرسم چه طور میشه که در یک برنامه که تحت شبکه با سی شارپ نوشتم رکوردی که توسط کاربر فعلی هست قفل بشه و تا زمانی که کاربر با این رکورد کار میکنه کسی نتونه با کار کنه
دیتا بیس در اس کیو است
با سلام به دوستان عزیز
من میخواستم بپرسم چه طور میشه که در یک برنامه که تحت شبکه با سی شارپ نوشتم رکوردی که توسط کاربر فعلی هست قفل بشه و تا زمانی که کاربر با این رکورد کار میکنه کسی نتونه با کار کنه
دیتا بیس در اس کیو است
خود MSDE این کار رو میکنه.
این کار اصلا پیشنهاد نمی شود! در برنامه های تحت شبکه برای پرهیز از کار همزمان کاربر ها بر روی یک رکورد اولین چیزی که به ذهن می رسد قفل کردن رکورد است که از طریق قفل کردن جدول و یا toggle کردن یک فیلد از جنس bit قابل اجرا است. اما مشکل اینجاست که چه هنگامی باید رکورد از حالت قفل شده خارج شود؟!
برنامه همیشه کاملا درست با سناریو های از پیش تعین شده پیش نمی رود. مثلا امکان دارد برنامه hang کند، یا کامپیوتری که به سرور متصل است به هر دلیل reset شود یا اصلا ارتباط با شبکه به صورت نرم افزاری یا سخت افزاری قطع شود، در این صورت برنامه هیچ گاه فرصت unlock کردن رکورد در database را پیدا نمی کند!
روش های متفاوتی برای handle کردن شرایطی که چند کاربر بر روی یک رکورد کار می کنند وجود دارد، مثل استفاده از socket ها و روش subscrbe کردن کاربر در شبکه های داخلی، یا روش TimeOut برای استفاده از یک رکورد. شخصا استفاده از versioning برای رکورد ها در Database را ترجیح می دهم، به این صورت که هر رکورد شامل فیلد version است که با هر بار تغییر به روز می شود. هنگام ذخیره تغییرات اگر version رکورد در database با version رکوردی که ذخیره می شود متفاوت باشد به این معنی است که رکورد توسط شخص دیگری تغییر کرده است
استفاده از version روش خوبي هست
لطفا در مورد استفاده از socket و روش subscribe يكم توضيح بدين
دوستمون جواب خوبی دادن ولی مشکلی که در روش version هست اینه که ممکنه سناریو به این صورت باشه :
فرض کنید که برنامه وقت دهی در یک بیمارستان...
کاربر فرم وقت دهی رو باز میکنه و اولین وقت خالی رو به بیمار پیشنها میده ، انوقت بیمار قبول میکنه و کاربر اطلاعات بیمار رو وارد میکنه و میخواد ثبت کنه که .... از شانس بدش همزمانی اتفاق میافته (حالا اگه متوجه هم زمانی هم بشیم فاییده ای نداره)، حالا بیمار هم که وقت رو ok کرده و رفته.
فکر میکنم بهترین راه استفاده از socket programing و یا wcf و Remoting از این قبل متد هاست.
در کل اگه لایه میانی رو در یک ایستگاه نصب کنیم ، میتونیم خیلی راحت و بدون فشار بر روی sqlServer از ماهیت data هامون دفاع کنیم و Validation رو در تمام کلاینت ها مشترک انجام بدیم.
سلام
دوستان در موارد خاص روش قفل کردن رکورد روش مناسبی است در این حالت سریعا رکورد Lock شده و پس از اتمام کار UnLock میشود در ضمن هنگام قطعی و هنگ و ... پس از مدتی Lock آزاد میشود(حتما امتحان کنید)
]
Set Tran Isolation Level Serializable
Begin Tran
Select * From Users With (RowLock) Where UserID=...
کلا باید فقط در زمان انتخاب سریع از select بدون قفل استفاده کرد.(dirty select)
بقیه موار نیاز به قفل گزاری داره ، که خود قفل گزاری و انتخاب انواع اون برای case مورد نظر نیاز به تجربه بالا داره .ولی به نظر بنده مسئله همزمانی داده ها باید قبل از sql تشخیص داده بشه.
می شه از Transaction استفاده کرد
با سلام
لطفا در خصوص Socket programin ، wcf و Remoting بیشتر توضیح دهید
دلیل نداره در این خصوص پس از ثبت مشخصات کار از کار بگذرد!!!!
برای حل این مشکل دو راه حل وجود دارد :
1 - قبل از تکمیل مشخصات وقت داده شده به صورت غیر قطعی (فقط به صورت پیشنهاد) اختصاص می یابد و پس از تکمیل تمام مراحل قطعی می شود یعنی مثلا بیمار نباید توقع داشته باشد وقتی که در ابتدای مراجعه به وی پیشنهاد می شود در انتها نیز به طور قطعی به او اختصاص یابد(حالت رقابتی)
2 - مقادیر غیر قطعی به یک جدول موقت انتقال داده می شوند و براساس این که کاربر حداکثر چقدر زمان لازم دارد تا کلیه مراحل را طی کند و مقدار غیر قطعی تبدیل به قطعی شود یک زمان یا rank به رکورد مزبور اختصاص داده می شود. اگر کاربر دیگری مراجعه نمود اول جدول حاوی مقادیر غیر قطعی چک می شود و از بین رکورد هایی که حداکثر زمان آنها گذشته است یک رکورد به وی اختصاص داده می شود (حالت ثابت با در نظر گرفتن حداکثر زمان در دست داشتن token)