mr.sirwan
چهارشنبه 27 اسفند 1399, 14:24 عصر
سلام و درود دوستان
بنده توی برنامه م یه مشکلی دارم اینکه چند کاربر بصورت همزمان بخوان نامه جدیدی ثبت کنن، اندیکاتور این چند نامه تکراری ثبت میشه، در حالیکه همچین مساله ای خیلی حیاتیه و نباید دو نامه با اندیکاتور یکسان وجود داشته باشن.
درحال حاضر روال کاریم به این شکله که وقتی یه نامه ای ثبت میشه من اون اندیکاتوری که ثبت شده رو یه واحد بهش اضافه میکنم و به عنوان آخرین اندیکاتور توی جدولی به اسم IndicatorTable ذخیره میکنم، حالا هروقت پنجره ثبت نامه جدید باز شد میرم از این جدول رکورد مربوط به اندیکاتور نوع نامه رو میخونم و داخل فرم نمایشش میدم، جدول IndicatorTable به این شکله:
public class IndicatorTable
{
public IndicatorTable()
{
LastInterIndicator = 1;
LastImportIndicatior = 1;
LastExportIndicator = 1;
}
[Key, ForeignKey("WorkYear")]
public int Id { get; set; }
public int LastInterIndicator { get; set; }
public int LastImportIndicatior { get; set; }
public int LastExportIndicator { get; set; }
public virtual WorkYear WorkYear { get; set; }
}
خب همونطور که گفتم الان با مشکل ثبت تکراری اندیکاتور مواجه هستم در حالتی که همزمان چند کاربر نامه جدید ثبت کنن یعنی مشکل فقط در حالت همزمانی هستش وگرنه بصورت ترتیبی مشکلی پیش نمیاد و اندیکاتور ها بصورت مرتب افزایش پیدا میکنن
حالا برای رفع این مشکل من اومدم فک کردم که یه جدول جدید ایجاد کنم با عنوان InUseIndicator که هرموقع پنجره ثبت نامه جدید باز شد، اندیکاتور جدید توی این جدول ذخیره بشه تا زمانیکه نامه توسط کاربر ثبت نهایی میشه، موقعیکه شخص دیگه ای هم توی سیستم خودش پنجره ثبت نامه جدید رو باز کرد، نرم افزار بره داخل جدول اندیکاتورهای در حال استفاده (InUseIndicator) رو چک کنه و متناسب با اون یه اندیکاتور جدید تولید کنه
که خب این راه هم یه سری مشکل داره: وقتی دوتا کاربر بصورت همزمان بخوان نامه ثبت کنن بر فرض اندیکاتور 22 و 23 بهشون تعلق بگیره و داخل جدول InUseIndicator ذخیره بشن ممکنه کاربر اول که اندیکاتور 22 داره از ثبت نهایی کردن نامه انصراف بده ولی کاربر با اندیکاتور 23 نامه ش رو ثبت کنه، اون موقع اندیکاتور 22 جا میمونه و سری بعد که نامه جدیدی خواستن ثبت کنن، اندیکاتور از 24 شروع میشه
برای رفع این مشکل میشه از یه flag استفاده کرد ولی فک کنم دیگه زیادی پیچیده میشه
خواستم از دوستان و اساتید نظر بخوام که برای رفع این مشکل و قفل کردن اندیکاتور راه حل بهتری سراغ دارن؟
بنده توی برنامه م یه مشکلی دارم اینکه چند کاربر بصورت همزمان بخوان نامه جدیدی ثبت کنن، اندیکاتور این چند نامه تکراری ثبت میشه، در حالیکه همچین مساله ای خیلی حیاتیه و نباید دو نامه با اندیکاتور یکسان وجود داشته باشن.
درحال حاضر روال کاریم به این شکله که وقتی یه نامه ای ثبت میشه من اون اندیکاتوری که ثبت شده رو یه واحد بهش اضافه میکنم و به عنوان آخرین اندیکاتور توی جدولی به اسم IndicatorTable ذخیره میکنم، حالا هروقت پنجره ثبت نامه جدید باز شد میرم از این جدول رکورد مربوط به اندیکاتور نوع نامه رو میخونم و داخل فرم نمایشش میدم، جدول IndicatorTable به این شکله:
public class IndicatorTable
{
public IndicatorTable()
{
LastInterIndicator = 1;
LastImportIndicatior = 1;
LastExportIndicator = 1;
}
[Key, ForeignKey("WorkYear")]
public int Id { get; set; }
public int LastInterIndicator { get; set; }
public int LastImportIndicatior { get; set; }
public int LastExportIndicator { get; set; }
public virtual WorkYear WorkYear { get; set; }
}
خب همونطور که گفتم الان با مشکل ثبت تکراری اندیکاتور مواجه هستم در حالتی که همزمان چند کاربر نامه جدید ثبت کنن یعنی مشکل فقط در حالت همزمانی هستش وگرنه بصورت ترتیبی مشکلی پیش نمیاد و اندیکاتور ها بصورت مرتب افزایش پیدا میکنن
حالا برای رفع این مشکل من اومدم فک کردم که یه جدول جدید ایجاد کنم با عنوان InUseIndicator که هرموقع پنجره ثبت نامه جدید باز شد، اندیکاتور جدید توی این جدول ذخیره بشه تا زمانیکه نامه توسط کاربر ثبت نهایی میشه، موقعیکه شخص دیگه ای هم توی سیستم خودش پنجره ثبت نامه جدید رو باز کرد، نرم افزار بره داخل جدول اندیکاتورهای در حال استفاده (InUseIndicator) رو چک کنه و متناسب با اون یه اندیکاتور جدید تولید کنه
که خب این راه هم یه سری مشکل داره: وقتی دوتا کاربر بصورت همزمان بخوان نامه ثبت کنن بر فرض اندیکاتور 22 و 23 بهشون تعلق بگیره و داخل جدول InUseIndicator ذخیره بشن ممکنه کاربر اول که اندیکاتور 22 داره از ثبت نهایی کردن نامه انصراف بده ولی کاربر با اندیکاتور 23 نامه ش رو ثبت کنه، اون موقع اندیکاتور 22 جا میمونه و سری بعد که نامه جدیدی خواستن ثبت کنن، اندیکاتور از 24 شروع میشه
برای رفع این مشکل میشه از یه flag استفاده کرد ولی فک کنم دیگه زیادی پیچیده میشه
خواستم از دوستان و اساتید نظر بخوام که برای رفع این مشکل و قفل کردن اندیکاتور راه حل بهتری سراغ دارن؟