PDA

View Full Version : روش های ارتباط با دیتابیس و چگونگی برخورد با همزمانی



csharpprogramer88
جمعه 11 مهر 1393, 16:52 عصر
فرض کنید برنامه شما چند کاربره باشه و امکان داشته باشه که چند کاربر همزمان از یه دیتابیس روی سرورتون استفاده کنند . حالا اگه دوتا شون بخوان همزمان یه رکورد رو ویرایش کنند چه اتفاقی می افته .؟

روش های مختلفی مانند ADO.NET,EF,LINQ,Stored PROsedure هر کدام چطور با این پدیده رفتار میکنند ؟


البته ظاهرا یکی از روشهای مقابله با این روش استفاده از SP هاست


با تشکر

alibilgats
جمعه 11 مهر 1393, 20:19 عصر
سلام
دوست عزیز اگر منظورتون از دیتابیس MS SQL هستش باید خدمتتون عرض کنم که خود MS SQL اینجور موارد رو کنترل میکنه! اصلا اصول بانک های اطلاعاتی که توانایی ارائه سرویس روی شبکه رو دارن همینه!
و اگر منظورتون اینه که برای مثال شما دارید توی برنامتون داده های یک رکورد رو توی یه فرم ویرایش میکنید و یه کار بر دیگه هم در همون زمان اطلاعات همون رکورد رو باز کرده و داره ویرایش میکنه باید بگم که تداخل در اینجا فقط زمانی معنی داره که هر دو کاربر همزمان دکمه ثبت رو بزنن! که این حالت هم توسط خود بانک اطلاعاتی مدیریت میشه.
ولی اگر فرض رو بر این بگیریم که شما یه رکورد رو باز کردید برای ویرایش و یه کاربر دیگه در همون زمان که شما در حال ویرایش هستید اون رکورد رو حذف کنه! در این حالت شما باید خطاها رو کنترل کنید و پیغام متناسب رو نمایش بدید.
امیدوارم درست توضیح داده باشم.

csharpprogramer88
جمعه 11 مهر 1393, 20:33 عصر
سلام
دوست عزیز اگر منظورتون از دیتابیس MS SQL هستش باید خدمتتون عرض کنم که خود MS SQL اینجور موارد رو کنترل میکنه! اصلا اصول بانک های اطلاعاتی که توانایی ارائه سرویس روی شبکه رو دارن همینه!
و اگر منظورتون اینه که برای مثال شما دارید توی برنامتون داده های یک رکورد رو توی یه فرم ویرایش میکنید و یه کار بر دیگه هم در همون زمان اطلاعات همون رکورد رو باز کرده و داره ویرایش میکنه باید بگم که تداخل در اینجا فقط زمانی معنی داره که هر دو کاربر همزمان دکمه ثبت رو بزنن! که این حالت هم توسط خود بانک اطلاعاتی مدیریت میشه.
ولی اگر فرض رو بر این بگیریم که شما یه رکورد رو باز کردید برای ویرایش و یه کاربر دیگه در همون زمان که شما در حال ویرایش هستید اون رکورد رو حذف کنه! در این حالت شما باید خطاها رو کنترل کنید و پیغام متناسب رو نمایش بدید.
امیدوارم درست توضیح داده باشم.

دقیقا منظورمم همینه که وقتی دو کاربر همزمان بدون هیچ فاصله ای بیان و مثلا دکمه آپدیت را بزنه چه اتفاقی میفته؟

امیر مهرشاد
جمعه 11 مهر 1393, 21:12 عصر
دقیقا منظورمم همینه که وقتی دو کاربر همزمان بدون هیچ فاصله ای بیان و مثلا دکمه آپدیت را بزنه چه اتفاقی میفته؟

مهندس بهترین راه حلی که برای این کار پیدا کردم اینه که بمحض اینکه آن رکورد خاص در معرض ویرایش یکی از کاربران قرار میگیرد بر اساس ID یا هر کد یونیکی که مربوط به آن رکورد میشه رو برای بقیه یوزرها قفل کنیم و پیغام این رکورد توسط کاربر X در حال ویرایش است مجددا سعی نماییدیا ...... رو بدیم و برای مدیریت بهتر این که یک کاربر در حال ویرایش رفت آبدارخونه به هوای صبحونه و .... خود بخود از حالت قفل دربیاد


از triger های sql هم میشه عالی استفاده کرد

csharpprogramer88
شنبه 12 مهر 1393, 09:27 صبح
مهندس بهترین راه حلی که برای این کار پیدا کردم اینه که بمحض اینکه آن رکورد خاص در معرض ویرایش یکی از کاربران قرار میگیرد بر اساس ID یا هر کد یونیکی که مربوط به آن رکورد میشه رو برای بقیه یوزرها قفل کنیم و پیغام این رکورد توسط کاربر X در حال ویرایش است مجددا سعی نماییدیا ...... رو بدیم و برای مدیریت بهتر این که یک کاربر در حال ویرایش رفت آبدارخونه به هوای صبحونه و .... خود بخود از حالت قفل دربیاد


از triger های sql هم میشه عالی استفاده کرد

مهندس میخام بدونم تکنولوژیهای مختلفی مانند ADO.NET,EF,LINQ,Stored PROsedure هر کدام چطور با این پدیده رفتار میکنند ؟
وگرنه خودم بخوام مدیریت کنم خیلی کارهای دیگه هم میشه کرد

alibilgats
شنبه 12 مهر 1393, 10:44 صبح
دقیقا منظورمم همینه که وقتی دو کاربر همزمان بدون هیچ فاصله ای بیان و مثلا دکمه آپدیت را بزنه چه اتفاقی میفته؟

گفتم که دوست عزیز! به هیچ وجه این امکان وجود نداره که دو نفر از سیستم مجزا با شرایط مختلف بیان و دکمه ثبت رو همزمان بزنن و بانک اطلاعاتی برای ثبت دچار مشکل بشه و خطای همزمانی بده! بر فرض محال اگر هم همچین اتفاقی بیفته خود بانک اطلاعاتی میاد دوتا درخواست رو در نهایت توی یه صف قرار میده.
و باید خدمتتون عرض کنم که هم ردیف قرار دادن تکنولوژی های
ADO.NET,EF,LINQ با
Stored Procedure صحیح نیست!! چون کلا کارشون فرق میکنه!

Stored Procedure کاربردش توی خود بانک اطلاعاتی هستش و هم ردیف Triger و Transaction و Function قرار میگیره در حالی که تکنولوژی های
ADO.NET,EF,LINQ برای اتصال هستن!
به نظر من شما نباید خودتون رو درگیر مسایل تداخل و همزمانی طرف دیتابیس کنید چون این موارد خیلی سال پیش توسط شرکت های تولید کننده بانک های اطلاعاتی برطرف شده.
شما فقط باید برخی موارد مثل ویرایش همزمان یا حذف و ویرایش همزمان و مواردی از این دست رو مدیریت کنید.
موفق باشید

mohammad5530
شنبه 12 مهر 1393, 11:46 صبح
Linq و EF رو استفاده بکنی هیچ وقت به مشکل همزمانی برخورد نمیکنی . چون بعد از هرنوع کوئری درواقع تمام میشوند

elec60
شنبه 12 مهر 1393, 12:13 عصر
وقتي يه كاربر به DataBase وصل ميشه و روي جدولي مي خواد كار كنه اون جدول توسط DBMS قفل ميشه و بقيه درخواستها تو صف قرار مي گيرن، و اين باعث اتلاف وقت ميشه، روشي ((with (updlock, holdlock) وجود داره كه فقط row مورد نظر رو lock ميكنه و بقيه ركوردها ميتونن توسط بقيه كاربرا استفاده بشن.

ديتابيس انجين هايي مثل MS SQL SERVER به صورت default كل جدول رو lock ميكنن!!!

اين مورد زياد به موضوع اينجا ربط نداشت ولي گفتم بد نيست اشاره اي كنم:



FROM TABLE_ITEM with (updlock, holdlock)

csharpprogramer88
شنبه 12 مهر 1393, 18:05 عصر
Linq و EF رو استفاده بکنی هیچ وقت به مشکل همزمانی برخورد نمیکنی . چون بعد از هرنوع کوئری درواقع تمام میشوند

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

m_soheyl_s
دوشنبه 10 آذر 1393, 09:22 صبح
...

ديتابيس انجين هايي مثل MS SQL SERVER به صورت default كل جدول رو lock ميكنن!!!

...


یعنی من یک جدول مشتریان در برنامه ام دارم و هر کارمند با مشتریان خودش کار داره. اگه یک کارمند جدول مشتریانش رو باز کنه، دیگر کارمندان نمی توانند در همان زمان به جدول مشتری دسترسی داشته باشند؟