کیان
2 سال پیش توسط کیان مطرح شد
4 پاسخ

جلوگیری از ویرایش همزمان یک رکورد و مشکلات ادامه دار آن

سلام به دوستان و اساتید
نزدیک به این سوال رو دوستان ممکنه پرسیده باشند اما چون مورد مهمی برام پیش اومده خواستم بدونم منطقی ترین و اصولی ترین روش برای این قضیه چی هست؟!!
سوال : برای اینکه به اهمیت موضوع اشاره کنم مجبورم مثال اپلیکیشن دیوار رو بزنم
من یک آگهی درخواست دادم و ثبت شده و منتظر تایید هستم اما در همین حین هم میتونم آگهی خودم رو ویرایش کنم
فرض کنید تایید کننده آگهی رو باز کرده و در حال نظارت هست تا بعد از اصلاحیات تایید کنه ولی همزمان خود درخواست دهنده هم ویرایشی روی آگهی انجام داده اما تایید کننده با توجه به آخرین اطلاعاتی که از رکورد دریافت کرده تایید خودش رو میزنه غافل از اینکه تغییرات جدیدی روی رکورد و وابسته هاش انجام شده و تایید کننده بدون مشاهده تغییرات جدید اون رو تایید میکنه

خب به نظر اولین و ساده ترین راه اضافه کردن ستون lock یا چیزی شبیه به این توی جدول هست اما اینکار به نظرتون درست و اصولی هست؟
ضمنا من که از لاراول به عنوان بک اند استفاده میکنم و توی اپ اندرویدی ام کارها رو هندل میکنم این کار (ستون lock) باعث اضافه کاری های دیگه هم میشه یعنی مثلا همزمان با خوندن رکورد باید لاک رو true کنم و اگر بدون هیچ تغییری صفحه بسته شد دوباره یه درخواست اضافی ارسال بشه و لاک false بشه و از این قبیل داستان ها ....

در کل ممنون میشم اساتیدی که تجربه این داستان رو دارن راهنمایی کنند؟ سپاس


ثبت پرسش جدید
فرید عقیلی
تخصص : طراح و توسعه دهنده وب
@faridaghili 2 سال پیش آپدیت شد
0

با توجه به اینکه روی لاراول هستی، ستون updatedat که بطور معمول روی جداول هست به راحتی مشکلت رو برطرف می‌کنه.
هربار که کاربر آگهی رو ویرایش می‌کنه، مقدار updatedat بروز میشه.

وقتی تایید کننده وارد صفحه بررسی آگهی میشه، اونجا مقدار updatedat رو هم تو فرم نگه دار و وقتی تایید می‌زنه، مقدار updatedat رو هم به سرور ارسال کن.
حالا تو سرور کافیه چک کنی آخرین باری که آگهی ویرایش شده بود بعد از لحظه‌ای که تایید کننده آگهی رو دیده نباشه. اگر بود به تایید کننده خطا میدی که این آگهی بعد اینکه شما دیدیش بروز شده.


woz
تخصص : fan of open source world
@wozniak 2 سال پیش آپدیت شد
0

سلام در مثالی که مطرح کردید میشه مورد رو اینطور هندل کرد
یک فیلد status داشته باشیم که کاربر تایید کننده فقط بتونه در status های خاصی تایید رو انجام بده مثلا اگر سفارش در status -> منتظر تایید باشه بتونه اون رو تایید کنه.
این سناریو رو داشته باشید : قبلا آگهی یبار ایجاد شده و منتظر تایید هست و تایید کننده روی آگهی هست برای تایید و شما همزمان میرید برای ویرایش status ؛:در حال ویرایش؛: میشه میشه : این جا دو سناریو هستش :

اگر تایید کننده روی یک صفحه realtime باشه و قابلیت این رو داشته باشه که شما وقتی رفتید روی ویرایش تو پنلش وضعیت آگهی رو همزمان تغییر بده و اون ببینه که تغییر کرده و امکان تایید رو ازش بگیره که حله قضیه

اما اگر تایید کننده روی پنل غیر realtime باشه این قابلیت رو باید در نظر گرفت که با زدن دکمه ی تایید کردن ، ابتدا وضعیت فعلی آگهی رو چک کنه و اگر از منتظر تایید خارج شده بود امکان تایید رو به تایید کننده نده و صفحه رو براش رفرش کنه

نیازی هم به lock کردن نیست


فرید عقیلی
تخصص : طراح و توسعه دهنده وب
@faridaghili 2 سال پیش آپدیت شد
0

با توجه به اینکه روی لاراول هستی، ستون updatedat که بطور معمول روی جداول هست به راحتی مشکلت رو برطرف می‌کنه.
هربار که کاربر آگهی رو ویرایش می‌کنه، مقدار updatedat بروز میشه.

وقتی تایید کننده وارد صفحه بررسی آگهی میشه، اونجا مقدار updatedat رو هم تو فرم نگه دار و وقتی تایید می‌زنه، مقدار updatedat رو هم به سرور ارسال کن.
حالا تو سرور کافیه چک کنی آخرین باری که آگهی ویرایش شده بود بعد از لحظه‌ای که تایید کننده آگهی رو دیده نباشه. اگر بود به تایید کننده خطا میدی که این آگهی بعد اینکه شما دیدیش بروز شده.


کیان
تخصص : ندارم ...
@kian.myphone 2 سال پیش مطرح شد
0

سلام مجدد
از @wozniak عزیز ممنونم راهنمایی تون مفید بود استفاده کردم
بله من الان توی جدولم یک ستون به اسم status دارم و به گونه ی دیگری ازش استفاده میکنم به طوری که وضعیت جاری درخواست رو داخلش ثبت میکنم مثل verify یا pending یا ...
توی بخش دیگری از اپلیکیشن که نیاز مبرم وجود نداره ، دقیقا همین کاری که شما فرمودید رو انجام دادم یعنی کاربر فقط در وضعیتی که من مشخص کردم میتونه تغییرات رو لحاظ کنه و در موارد دیگر امکانش نیست اما در برخی جاها نیز هست که کاربر رو منتظر نگذاریم

در این مورد نظر دوست عزیز مون@faridaghili به نظرم مشکل رو حل میکنه و اشاره ی خوبی کردند ممنون ازشون ...

چون توی اندروید یا حالا ios پیاده سازی realtime پیچیده میشه مورد updated_at به نظرم میتونه مشکل رو برطرف کنه ممنون

دوستان داشتم بررسی میکردم یه سوالی ذهنم رو درگیر کرد
مثلا همون دیوار رو در نظر بگیرید من یه آگهی ثبت کردم و تایید شده و نمایش داده شده وقتی درخواستم رو ویرایش میکنم میگه تا زمانیکه این آگهی تون تایید بشه آگهی قبلی تون (یعنی قبل از ویرایش) همچنان نمایش داده خواهد شد که به قولی فرصت دیده شدن تا زمان تایید مجدد از کاربر گرفته نشه
به نظرتون برای این کار یک جدول متناظر درست کرده و درخواست ویرایش رو توی اون ثبت میکنه و بعد از تایید این رکورد رو با رکورد اصلی توی جدول اصلی جایگزین و از اینجا پاک میکنه یا روش دیگه ای هست؟
سپاس


فرید عقیلی
تخصص : طراح و توسعه دهنده وب
@faridaghili 2 سال پیش مطرح شد
0

وقتی کاربر ویرایش می‌کنه، در یک جدول مجزا بصورت کامل ذخیره کنین، فقط با این تفاوت که در این جدول id رکورد اصلی در جدول اصلی رو هم نگه دارید.
اینطوری آگهی قبلی همچنان داره با اطلاعات قبل نمایش داده میشه.
وقتی مدیر تغییرات رو تایید کرد، جدول اصلی رو با دیتای موجود در جدول ثانویه آپدیت کنین و اون رکورد موقت در جدول دوم رو هم حذف.


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام