PDA

View Full Version : جلوگیری از همزمانی در database



jafar2012
یک شنبه 18 مهر 1395, 12:41 عصر
سلام
پایگاه داده روی سرور فعال کردم
و تمامی کلاینت ها میتونن بهش وصل بشن
فقط مشکلی هست یکی در اون لحظه داره یک رکورد جدید ثبت میکنه
یکی هم داره تمام رکوردهای جدول رو میخونه
یا یکی در حال ویرایش و این قبیل حالات!

یکجا گفته شده بود پایگاه داده firebird این قابلیت رو داره و نیاز ب کاری نیست اونم بخاطر ویژگی isolation

و درمورد لاک جداول خوندم و یکسری راه کار های بر اساس این

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

پایگاه داده mysql زبانم ک c#

mrali.jalali
یک شنبه 18 مهر 1395, 14:14 عصر
در مورد ترانزکشن داخل شی شارپ تحقیق کن

ali_md110
یک شنبه 18 مهر 1395, 16:05 عصر
سلام
در مورد Rowversion و مباحث همزمانی تحقیق کنید
خلاصش رو میگم
در اسکیول سرور در هر جدول بانک فبلدی با نوع rowversion تعریف می کنیم که قبلا از نوع timestamp بود
وظیفه این فیلد اینه یکی قفل کردن هر رکورد و دیگری وارد صف کردن رکورد برای پردازشهای بعدی

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

این یک فیلد باینری هست که به ازای هر ویرایش رکورد یک عدد به اون اتوماتیک اضافه میشه
مثلا اگر یک کاربر داره رکوردی رو ویرایش میکنه در همون لحظه این فیلد اپدیت میشه
و تا زمانی که این عدد تغییر نکرده و اسکیول سرور پایان ویرایش اونو تایید نکرده کاربر دیگه ای نمیتونه اونو ویرایش کنه یا حذف

امیدوارم مطلب رسونده باشم

jafar2012
دوشنبه 19 مهر 1395, 08:12 صبح
سلام
ممنون از پاسخ هاتون
سه تا مورد مختلف دیدم

استفاده از فیلد timestamp
استفاده از transactionscope در c#
یکی هم میگفت استفاده از transaction داخل کوعری ها

این ها رو هم دیدم

http://www.w3resource.com/mysql/mysql-transaction.php
https://msdn.microsoft.com/en-us/library/system.transactions.transactionscope(v=vs.110).asp x
http://stackoverflow.com/questions/13394842/how-to-configure-mysql-to-rollback-when-using-transactionscope
https://forums.asp.net/t/1239791.aspx?Does+TransactionScope+work+really+wit h+MySql+

اما واقعا موندم چطور ازشون استفاده کنم و اصلا دقیقا همون کاری که میخام انجام میدن
ببینید:
فرضا یک جدول داریم که شامل آی دی کالا - نام کالا - قیمت هست
حالا:
20 تا کلاینت مستقیم کوعری میزنن به سرور mysql
1) در برنامه هم تمام کلاینت ها تمام رکورد های جدول رو میگیرند نه ب صورت تک تک یا انتخابی
2) یک کاربر داره یک رکورد ویرایش میکنه - یکی ثبت میکنه - یکی حذف و این کار رو ب صورت مداوم در طی روز انجام میشه

لطفا راهنمایی کنید کدوم روش مطمن تر و دقیق تر || و برای این کار مناسب تر هست

black_fire667
دوشنبه 19 مهر 1395, 08:51 صبح
دوست عزیز استفاده از TimeStamp رو شخصا توصیه میکنم بهتون!
وقتی بحث تراکنش میشه یعنی اینکه یک مجموعه اعمال و فرامین یا باید بصورت کامل اجرا بشن یا اگر مثلا تا نصف رفت و یکی از فرامین با شکست مواجه شد بقیه قبلی ها هم بر میگردن به حالت قبلشون که رل بک میگیم بهش!

حالا برای مثال شما که دو کاربر در آن واحد نتونن یه رکورد رو ویرایش کنن تنها راهش استفاده از تایم استامپ هست! البته روشهای دیگه ای ام هست که بصورت دستی کنترلشون کنی که خب تایم استامپ بهینه شده است.