PDA

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



Jason.Bourne
چهارشنبه 22 خرداد 1392, 17:56 عصر
چطوری میتونم برنامه ای بنویسم که به عنوان تست همزمان بیش از یک کاربر، به یک رکورد مشخص در دیتابیس عمل کند؟!

در واقع میخواهم اسکریپتی بنویسم که سناریوی دسترسی همزمان بیش از یک کاربر به یک رکورد مشخص از دیتابیس را شبیه سازی کند و نتیجه را نمایش دهد!

eshpilen
چهارشنبه 22 خرداد 1392, 22:26 عصر
خب با sleep گذاشتن بین دستورات و/یا اینکه درخواستها به یک روشی با هم ارتباط برقرار کنن میشه شبیه سازی انجام داد، اما بنظرم نتیجش در موارد عمومی و عادی بدیهی است و نیازی به تست نیست.
مثلا شما میخوای درخواست A یک کوئری اجرا کنه و قبل از اینکه به کوئری دوم برسه درخواست B کوئری خودش رو اجرا کنه، میای بین کوئری اول و دوم یک ‎sleep(10)‎ میذاری که فرصت کافی برای تست دستی رو میده. البته درخواست B توسط یک فایل دیگه پردازش میشه که اون sleep رو نداشته باشه (یا اینکه با پارامتری چیزی بهش حالی میکنی که sleep رو غیرفعال کنه).

ولی اگر میخوای در شرایط مشابه شرایط واقعی تست بشه خب بنظرم دشواره و حداقل نیاز به امکانات و نرم افزارهای خاص خودش داره.
یعنی مثلا سرور اینقدر قوی باشه که بتونه تعداد زیادی درخواست بصورت همزمان رو اجرا کنه، بعد با یه برنامه ای چیزی (فکر کنم برنامه های مخصوص اینطور کارها و تست load و اینها وجود دارن) یا چیزی که خودت طراحی میکنی، تعداد زیادی درخواست همزمان به هدف ارسال میکنی تا ببینی نهایت مشکلی چیزی پیش میاد یا نه. البته بحث تنظیمات هدفمند این درخواستها هم مهمه.

خب اون روش اول که گفتم بنظرم خیلی ساده تره؛ ولی برای وقتی هست که دقیقا مشکل و سناریو رو میدونی و میخوان نشون بدی/ثابت کنی/بررسی دقیقتر کنی.

دقیقا هدف شما از این قضیه چیه؟

plague
چهارشنبه 22 خرداد 1392, 22:43 عصر
یه دکمه بزار با فشردنش دوتا درخواست ایجکس همزمان بفرست و از دیتابیس داده ها رو بگیر نتیجه رو توی فایرباگ نگاه کن
این راحت ترین کاریه که میتونی انجام بدی

eshpilen
چهارشنبه 22 خرداد 1392, 22:55 عصر
یه دکمه بزار با فشردنش دوتا درخواست ایجکس همزمان بفرست و از دیتابیس داده ها رو بگیر نتیجه رو توی فایرباگ نگاه کن
این راحت ترین کاریه که میتونی انجام بدی
اینطوری آخه احتمال اینکه تداخل بر اساس همزمانی پیش بیاد زیاد نیست. شاید هزار بار هم این کار رو تکرار بکنه یک مورد از تداخل پیش نیاد.
چون بحث زمانهای خیلی کوچک هست. و از طرف دیگر به علت پارامترهای مختلفی که بعضا دونستن یا حدس زدن اونا ساده یا حتی شدنی نیست، ممکنه تداخل به این راحتی پیش نیاد.
همون درخواست ایجکس که میفرستید، باز داره از یک سیستم از یک مرورگر ارسال میشه و به احتمال زیاد عملا درخواستها بصورت بقدر کافی همزمان ارسال نمیشن و یکی از دیگری مقداری پیش خواهد بود، و بنابراین احتمال پیش آمدن تداخل ناشی از همزمانی در اجرای اونها کمتر میشه.

eshpilen
چهارشنبه 22 خرداد 1392, 23:04 عصر
تداخل بر اثر همزمانی به قدرت سیستم هم بستگی داره.
مثلا من یه سیستم قدیمی P4 دارم که تک هسته ایه.
خب طبیعتا سیستم من نمیتونه بطور همزمان پردازشهای زیادی مربوط به چند برنامه و درخواست رو انجام بده، بنابراین احتمال تداخل همزمانی کم میشه. و سیستم من شاید نهایت دو سه تا درخواست رو بصورت تقریبا همزمان اجرا کنه. بنابراین اگر از برنامه های تستر مخصوص این کارها هم روی سیستم خودم استفاده کنم، احتمالا اصلا جواب نمیده.
ولی یک سرور قوی که چندین و چند هسته داره و میتونه همزمان به ده ها، صدها، و شاید هزاران درخواست جواب بده، مسلما احتمال تداخل همزمانی درش خیلی بالاتر میره (البته به شرط اینکه تعداد زیادی درخواست هم ارسال شده باشن - ترافیک بالا باشه).

Jason.Bourne
پنج شنبه 23 خرداد 1392, 01:04 صبح
خب اون روش اول که گفتم بنظرم خیلی ساده تره؛ ولی برای وقتی هست که دقیقا مشکل و سناریو رو میدونی و میخوان نشون بدی/ثابت کنی/بررسی دقیقتر کنی.

دقیقا هدف شما از این قضیه چیه؟

من میخواهم حالت های مختلفی که میشه روی جدول و سطر ها قفل گذاشت را بصورت عملی بررسی نمایم.

اما فکر نمیکنم استفاده از sleep به کار من بیاد.
چون sleep در سمت PHP انجام میشه. یعنی یا قبل از اجرای query یا بعدش.
به نظرم من به یک چیزی مانند همون Sleep اما در سمت Mysql نیاز دارم.
اینطور نیست؟

Jason.Bourne
پنج شنبه 06 تیر 1392, 10:02 صبح
نظر دیگه ای نیست؟