PDA

View Full Version : جلوگیری از همزمان وارد کردن اطلاعات



mojtabadj
چهارشنبه 18 فروردین 1389, 11:00 صبح
سلام دوستان

برنامه من تحت شبکه هست و کلاینت ها اطلاعات رو در بانک سرور ذخیره میکنند . حال من نمیخوام

که رو یک جدول همزمان چند کلاینت اطلاعات رو وارد کنند .

برای اینکه در آن واحد فقط یک کلاینت بتونه در جدول کار عملیات انجام بده باید جیکار کرد؟

با تشکر از دوستان

ebrahimv
چهارشنبه 18 فروردین 1389, 12:05 عصر
شما چرا می خواهی محدودیت ایجاد کنی
اگه هم با هم وارد کنن فکر نکنم هیچ مشکلی پیش بیاد.
مگر این که در برنامه نویسیتون درست عمل نکرده باشید.

mojtabadj
چهارشنبه 18 فروردین 1389, 21:04 عصر
کسی نیست جواب بده؟:ناراحت:

sari-1369
چهارشنبه 18 فروردین 1389, 21:18 عصر
ببین دوست عزیز ، وارد کردن اطلاعات به طور دقیقا همزمان اتفاق نمی افته و حتما یه اختلاف چند صدم ثانیه داره و 2 عمل جدا به حساب میاد . شما اگر بانکت رو درست طراحی کرده باشی قطعا مشکلی نخواهی داشت . فرض کن توی جدولی کلید اصلی شما یه فیلد Identity هستش ، اگر 2 رکورد براس ثبت ارسال بشن قطعا یکی اول درج میشه و بعد رکورد دوم ثبت میشه . یا برای مثال دیگه فرض کنم یه فیلد رو عنوان کلید انتخاب کرده باشیم ، 2 رکورد هم برای این فیلد یک مقدار شبیه هم ارسال کردن ، اولی که درج شد دیگه sql از رکورد دوم خطا میگیره و اجازه ثبت نمیده . اما اگر شما فیلد رو توی جدولتون به عنوان کلید انتخاب نکنی و فقط توی فرم چک کنی که رکوردی با شرط وجود این فیلد وجود داره یا و بعد عمل ثبت رو امجام بدی ممکنه تو فاصله چک کردن فیلد تکراری تا ارسال رکورد ، رکورد دیگه ای با اون شرط ارسال بشه . پس اگر بانکتون درست طراحی بشه مشکلی در ورود اطلاعات نیست .

اما موضوع دیگه ویرایش و یا حذف اطلاعات هستش . یه وقت پیش میاد که اطلاعات یک جدول برای 2 کاربر نمایش داده میشه و کاربر 1 میاد از مثلا تعداد یک کالایی 5 تا کم میکنه و تغیرات رو توی فرم محاسبه میکنه و فقط مقدار جدید رو توی بانک ذخیره میکنه و کاربر دوم هم میخواد به تعداد 3 تا اضافه کنه و اون هم تغیرات رو توی فرم محاسبه میکنه و فقط مقدار نهایی رو آپدیت میکنه . اینجا کاربر شماره 2 ، اعداد 3تارو به مقداری که موقع نمایش جدول دریافت کرده اضافه میکنه نه اون مقداری که بعد از تغیرات کاربر شماره 1 توی جدول قرار گرفته .

saeid.memfis
چهارشنبه 18 فروردین 1389, 22:01 عصر
دوستمون درست مي گن...
من هم برنامه داشتم كه 4 تا سيستم با هم اطلاعات وارد مي كردن و هيچ مشكلي نداشتن...
اما اگر روي اين كار اصرار داري مي توني وقتي يكي از كلاينت ها فر مي رو باز كرد مقداري رو در رجيستري يا بانك (مثلا 0 و 1)قرار بدي و هنگان باز كردن فرما چك كني كه اگه 1 بود يعني فرم در يكي از كلاينتها باز است و اجازه ادامه كار بهش ندي
راه ديگه اي به ذهنم نمي رسه..

hooooman
پنج شنبه 19 فروردین 1389, 01:06 صبح
بهترین راه استفاده از عکس العملیه که اجرای 1 تراکنش در پی داره.یعنی Lock کردن 1 رکورد در زمان اجرای تراکنش.اگه اطلاعات کامل بخای کلی توضیح داره و اصلا 1 بحث تخصصی در زمینه پایگاه اطلاعاتیه.اگه به بخش SqlServer سری بزنی آستاد ثباتی توضیحات کاملی رو برای این مورد دادن.
Xlock,Rlockو.....

hooooman
پنج شنبه 19 فروردین 1389, 01:09 صبح
در ضمن اون بحث 0و1 از بیخ و بن کار غلطیه .اگر برق حین کار قطع شد یا سرور Crash کرد چیکار میکنین؟خب اون 1 همیشه 1 میمونه!!!!!!!!!!!!!!!!!:متعجب::متعج ب::متعجب:

مهدی نان شکری
پنج شنبه 19 فروردین 1389, 08:38 صبح
با سلام
Lock کردن جدول راه حل شما است. ولی در این صورت همزمانی رو در سیستم خودتون از بین می برین.
آیا واقعا در سیستم شما نیازی به چنین کاری هست؟

saeid.memfis
پنج شنبه 19 فروردین 1389, 10:12 صبح
در ضمن اون بحث 0و1 از بیخ و بن کار غلطیه .اگر برق حین کار قطع شد یا سرور Crash کرد چیکار میکنین؟خب اون 1 همیشه 1 میمونه!!!!!!!!!!!!!!!!!:متعجب::متعج ب::متعجب:
ممنون از راهنماييتون دوست عزيز

mojtabadj
پنج شنبه 19 فروردین 1389, 20:54 عصر
بهترین راه استفاده از عکس العملیه که اجرای 1 تراکنش در پی داره.یعنی Lock کردن 1 رکورد در زمان اجرای تراکنش.اگه اطلاعات کامل بخای کلی توضیح داره و اصلا 1 بحث تخصصی در زمینه پایگاه اطلاعاتیه.اگه به بخش SqlServer سری بزنی آستاد ثباتی توضیحات کاملی رو برای این مورد دادن.
Xlock,Rlockو.....

با تشکر از شما تو اون تالار هم پست دادم ولی شما ebook در مورد این قفل کردن ها ندارید؟