PDA

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



hahaie
دوشنبه 14 فروردین 1396, 21:36 عصر
سلام دوستان.
بنده یه فرم دارم که سه عمل اصلی (درج،بروزرسانی و حذف)رو با استفاده از پروسیجرهایی که توی Sql Server نوشته شده اند انجام میدن.دو عمل اولی از طریق تکست باکس انجام میشه یعنی تکست باکس هایی که روی فرم گذاشتم و مقادیرش به پروسیجر ارسال میشه.تنها کاریم که شیوه کاری من هستش و توی اکثر فرم ها اینکار رو کردم بالای فرم یه گرید گذاشتم که رکوردها داخل اون آورده شده و هر رکوردی انتخاب میشه اطلاعات اون رکورد توی تکست باکس ها آورده میشه و کاربر از طریق تکست باکس ها میتونه عمل ویرایش رو انجام بده و البته درج هم همینطور.
حالا مشکل اینجاست که وقتی نرم افزار رو دوبار اجرا میکنیم(در واقعا انگار دو کاربر نرم افزار رو اجرا کردند)و توی هر دو مثلا فرم مربوط به اطلاعات پرسنل رو میاریم برای مثال رکوردی با این مشخصات داریم: نام:علی فامیل:معینی مدرک:فوق دیپلم
کاربر 1 قصد تغییر فامیل به "معین پور" رو داره که قبلا اشتباه درج شده.
کاربر 2 قصدد تغییر مدرک رو به "لیسانس" داره که قبلا اشتباه درج شده.
در واقع اطلاعات درست: "علی،معین پور،لیسانس" هستش
هر دو کاربر رکورد را انتخاب کرده اند یعنی اطلاعات رکورد به تکست باکس ها آورده شده.کاربر 1 تغییر خود رو اعمال میکنه یعنی فامیل به "معین پور" تغییر می کنه کاربر 2 که اطلاعاتش توی تکست باکس ها هنوز اون قدیمیه هست(یعنی :علی معینی فوق دیپلم)فقط مدرک رو به لیسانس تغییر میده و مشخصات اصلاح شده توسط کاربر 1 رو بی اثر میکنه چون نتیجه میشه "علی معینی لیسانس" .
خب بنظرتون راهکار چیه؟
ممنون

group45
سه شنبه 15 فروردین 1396, 17:39 عصر
با سلام
راهکار اینه که فقط همون فیلدی که مشکل داره رو تغییر بدن نه همه رو.

hahaie
سه شنبه 15 فروردین 1396, 21:15 عصر
با سلام
راهکار اینه که فقط همون فیلدی که مشکل داره رو تغییر بدن نه همه رو.

کاربر که فقط همون فیلد یا فیلدایی که میخواد رو تغییر میده منم توی پروسیجرهام یا توی برنامه راهکاری مشخص نکردم که برنامه متوجه بشه کدوم فیلد تغییر کرده چون یکم پیچیده میشه اگه بخوام این کار رو بکنم.
بعدد از اون فرض کنید هر دو کاربری که در بالا گفتم(به فرض مثال)میخواند فیلد مدرک رو تغییر بدن یکی به دیپلم و دیگری به لیسانس.الان هم هر دو کاربر روی همین رکورد هستن که دارن مدرک آقای احمد معینی رو ' فوق دیپلم ' میبینند.کاربر 1 اون رو به دیپلم تغییر میده ولی کاربر 2 هنوز متوجه نشده که این مقدار تغییر پیدا کرده و اطلاعی از مقدار جدید نداره و....(این فکر کنم یه مقدار پیچیده تر شد دوستان همون جواب سوال بالایی بنده رو بدهند ممنون میشم).

شاید یه راهکار این باشه که دکمه ای قرار بدیم روی فرم که کاربر 1 یک رکورد رو اول در حالت ویرایش قرار بده و از این موقع این رکورد توسط هیچ کس دیگه ای نتواند در حالت ویرایش قرار بگیره مگر اینکه رکورد از حالت ویرایش خارج بشه.اما چطوری نمیدونم!! :لبخندساده:

hahaie
جمعه 18 فروردین 1396, 10:47 صبح
کسی نمیدونه جواب چی میشه؟
پست زیر رو پیدا کردم اما دو بحث داره:
1.در VB هستش
2.مثل من از تکست باکس (و همچنین کامبوباکس و چک باکس و...)برای درج یا ویرایش رکوردها استفاده نکرده ظاهرا این عملیات رو توی خود DGV انجام میده:
مثال (http://barnamenevis.org/showthread.php?64301-%D9%85%D8%B4%DA%A9%D9%84-%D9%87%D9%85%D8%B2%D9%85%D8%A7%D9%86%DB%8C-%D8%AF%D8%B1-%D8%B4%D8%A8%DA%A9%D9%87)

Mahmoud.Afrad
شنبه 19 فروردین 1396, 02:11 صبح
یک ستون از نوع timestamp به جدولتون اضافه کنید(به rowVersion هم معروف هست و خودکار مقدار میگیره). زمانی که اطلاعات یک سطر رو دریافت میکنید و در کنترلها نمایش میدید، یک متغیر در سطح فرم تعریف کنید و مقدار ورژن آن سطر رو نگهداری کنید. در زمان آپدیت چک کنید ورژن رکورد با ورژن قبلی رکورد(همان متغیر) اگر برابر بود آپدیت انجام و در غیراینصورت پیغام مناسب به کاربر نمایش دهید و اطلاعات رو دوباره از جدول بخونید تا تغییرات دیگران رو بدست بیارید.

hahaie
یک شنبه 20 فروردین 1396, 18:21 عصر
یک ستون از نوع timestamp به جدولتون اضافه کنید(به rowVersion هم معروف هست و خودکار مقدار میگیره). زمانی که اطلاعات یک سطر رو دریافت میکنید و در کنترلها نمایش میدید، یک متغیر در سطح فرم تعریف کنید و مقدار ورژن آن سطر رو نگهداری کنید. در زمان آپدیت چک کنید ورژن رکورد با ورژن قبلی رکورد(همان متغیر) اگر برابر بود آپدیت انجام و در غیراینصورت پیغام مناسب به کاربر نمایش دهید و اطلاعات رو دوباره از جدول بخونید تا تغییرات دیگران رو بدست بیارید.
ممنون دوست عزیز.
میشه بفرمایید این ستون از نوع timestamp چه موقعی مقدار میگیره؟
ضمن اینکه ظاهرا این نوع فقط در ورژن 2012 به بعد وجود داره.در sql 2008 چکار باید کرد؟
ممنون

Mahmoud.Afrad
یک شنبه 20 فروردین 1396, 23:26 عصر
هر دیتابیس یک کلید داره که با هر بار insert و update ای، این کلید به صورت افزایشی تغییر خواهد کرد و این کلید منحصر به فرد هست. اگر در جدولی ستونی از نوع timestamp استفاده کنید با هر تغییری در اون سطر، مقدار این فیلد به صورت خودکار به مقدار آن کلید منحصر به فرد به روز خواهد شد. خلاصه اینکه با هر تغییری در اون سطر، مقدار rowversion تغییر میکنه و شما میتونی متوجه تغییر توسط دیگران بشی.
طبق لینک زیر در sql server 2008 هم این نوع وجود دارد
https://docs.microsoft.com/en-us/sql/t-sql/data-types/rowversion-transact-sql
https://www.connectionstrings.com/sql-server-2008-data-types-reference (https://docs.microsoft.com/en-us/sql/t-sql/data-types/rowversion-transact-sql)