PDA

View Full Version : مشکل همزمانی کار بر روی یک پرونده یا یک موضوع



SepidehZ
یک شنبه 01 آبان 1390, 20:11 عصر
یک برنامه پزشکی دارم که شماره پرونده بیمار را گرفته و اطلاعات راجع به حساسیت و دارو و ... اطلاعات بیمار را ثبت میکند.این صفحه ممکن است توسط چند کاربر همزمان باز شود.میخواهم کنترل کنم که هرگاه ش پرونده ای توسط یک کاربر باز شد، کاربر دیگر نتواند با آن شماره پرونده کار کند
یک روشی که ممکن است کارکند این است که:
هر ش پرونده ای که توسط کاربری باز شد، شماره پرونده آن را به همرا کد کاربر در یک جدول ذخیره کند و هرگاه کاربا آن شماره پرونده تمام شد ،ش پرونده و کد کاربر را از جدول حدف کند.
مشکلی که دارم این است که :اگر برق رفت یا خروج غیرمنتظره از سیستم رخ داد. اطلاعات مربو ط به کاربرهایی که در سیستم بودند در جدول مربوطه باقی میماند
و کار با آن شماره پرونده ها غیر ممکن میشود چون پیغام میدهد که این ش پرونده توسط کاربر دیگری باز شده است ( چون اطلاعات کاربران در اثر برق رفتن در جدول باقی مانده)

اگر ممکن است در این زمینه کمکم کنید و یا اگر راه بهتری سراغ دارید که اطلاع دهد کاربر دیگری همزمان دارد با سیستم کار میکند راهنمایی ام کنید

ArashRoshan
یک شنبه 01 آبان 1390, 20:25 عصر
با سلام
با توجه به گفته های شما احتمالا یک سرور موجود می باشد ، اگر من بودم این کار رو می کردم :

هر کاربر که وارد می شه داخل یک جدول ذخیره می کنم و اون جدول رو داخل یک پوشه بنام Temp ذخیره می کنم . حالا هربار که برنامه ی سرور اجرا شد اون پوشه ی Temp رو پاک کنه و دوباره بسازه .
این طوری اگر برق رفت پوشه پاک میشه و دوباره ساخته میشه .
تا اونجایی که می دونم خود ویندوز هم تو برخی جاها از همین روش استفاده میکنه .

در ضمن اگر برنامه تحت سرور کار نمیکند ، لطفا بیشتر نسبت به چگونی ارتباط کاربرها توضیح بدید .

موفق باشید .

Mani_rf
یک شنبه 01 آبان 1390, 21:26 عصر
SQL Server یک فرمان برای این کار دارد، رکورد خوانده شده را قفل می کند و در صورتی که کاربر دیگری آن را بخواند اجازه تغییر به کاربر دوم نمی دهد و پیغام خطا بر می گرداند که می توانید آن را مدیریت کنید. متاسفانه نام و طریق کارکرد آن را فراموش کردم ولی می توانی این موضوع را در انجنم SQL مطرح کنی. مطمعنا به جواب میرسی.

Mani_rf
یک شنبه 01 آبان 1390, 21:42 عصر
لازم نیست تو انجمن SQL هم مطرح کنید. بفرمایید :
بعد از Select کردن رکورد(های) مورد نظر بعد از کلمه کلیدی From بنویسید With (HordLock) تا رکورد مورد نظر قفل شود.

مثال :
SELECT * FROM Person.Address WITH (HOLDLOCK)
WHERE AddressId = 2

توضیحات تکمیلی در این سایت. (http://www.sqlteam.com/article/introduction-to-locking-in-sql-server)
منبع ماکروسافت (http://msdn.microsoft.com/en-us/library/aa213026.aspx)