PDA

View Full Version : سوال: کم یا زیاد کردن اعتبار پولی کاربرها به چه صورت باید انجام بشه؟



i-php-i
یک شنبه 22 تیر 1393, 13:53 عصر
می خوام اعتبار پولی کاربرها رو توی وب سایت کم یا زیاد کنم، برای اینکار باید از تراکنش استفاده کرد ؟

hamidhassas
یک شنبه 22 تیر 1393, 14:06 عصر
یعنی چی دقیقا میخوای چکار کنی اگه میخوی مثلا یک کاربری که 20000 تومن پول داره حالا مثلا یک جنس ازت خریده 15000 تومن بیاد و از اون مقدار اعتبار اول کم کنه راهش سادس اول مبلغ رو کم کن و حاصلش رو بجای مقدار 20000 بروز کن



$c=$a-$b

thacker
یک شنبه 22 تیر 1393, 15:00 عصر
در مثال زیر شما 1200 ( تومان یا ریال یا ... ) رو به حساب کاربری فردی با آیدی 1 می افزایید :


$cash = 1200;
$add_cash = mysql_query ("UPDATE `users` SET `cash` = cash+$cash WHERE `user_id` = '1'");

i-php-i
یک شنبه 22 تیر 1393, 17:21 عصر
این روشها یه مشکل داره و اونم اینکه اگر یه قسمت از نرم افزار بخواد به حساب کاربر پول واریز کنه و همزمان یه قسمت دیگه بخواد پول کم کنه احتمال محاسبات دچار اشتباه بشن، راه بهتر اینه که کوئری اول ردیف مورد نظر رو قفل کنه بعد کارهای مورد نیاز رو انجام بده اما نمی دونم چطور باید این کارو کرد!

hamidhassas
یک شنبه 22 تیر 1393, 19:25 عصر
این روشها یه مشکل داره و اونم اینکه اگر یه قسمت از نرم افزار بخواد به حساب کاربر پول واریز کنه و همزمان یه قسمت دیگه بخواد پول کم کنه احتمال محاسبات دچار اشتباه بشن، راه بهتر اینه که کوئری اول ردیف مورد نظر رو قفل کنه بعد کارهای مورد نیاز رو انجام بده اما نمی دونم چطور باید این کارو کرد!
چی دچار مشکل بشه؟؟؟ این کار چنان سریع انجام میشه در کسری از صدم ثانیه که چنین اتفاقی نمی افته اگه تو ستی همچین کاری کنی به مام یاد بده از بی سوادی در بیایم

under22
یک شنبه 22 تیر 1393, 20:54 عصر
باید وقتی میخای عملی رو فیلد پول انجام بدی اونو قفل کنی که اگه به طور اتفاقی عمل دیگه ایی قرار رو اون فیلد رخ بده منتظر این عمل بمونه .
این اتفاق خیلی مهمه مخصوصا تو سایت های بزرگ ممکنه یه موقعیتی پیش بیاد که یه عمل همزمان روی یه فیلد مهم انجام بشه ولی با قفل کردن یا ترنزیشن جلوشو میگرن .
وقتی قفل می کنید اگه درخواست دیگه ایی بیاد منتطر میمونه که قفل باز بشه .
یه نمونه قفل کردن

mysql_query("LOCK TABLES tablename WRITE|READ;");
mysql_query("UNLOCK TABLES;");

hamidhassas
یک شنبه 22 تیر 1393, 22:10 عصر
باید وقتی میخای عملی رو فیلد پول انجام بدی اونو قفل کنی که اگه به طور اتفاقی عمل دیگه ایی قرار رو اون فیلد رخ بده منتظر این عمل بمونه .
این اتفاق خیلی مهمه مخصوصا تو سایت های بزرگ ممکنه یه موقعیتی پیش بیاد که یه عمل همزمان روی یه فیلد مهم انجام بشه ولی با قفل کردن یا ترنزیشن جلوشو میگرن .
وقتی قفل می کنید اگه درخواست دیگه ایی بیاد منتطر میمونه که قفل باز بشه .
یه نمونه قفل کردن

mysql_query("LOCK TABLES tablename WRITE|READ;");
mysql_query("UNLOCK TABLES;");

آخه چطور امکان داره همچین چیزی ؟ من که نمیفهمم که آخ7 چنین کاری چه لزومی داره

under22
یک شنبه 22 تیر 1393, 22:28 عصر
آخه چطور امکان داره همچین چیزی ؟ من که نمیفهمم که آخ7 چنین کاری چه لزومی داره

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

نیلوفر66
یک شنبه 22 تیر 1393, 22:44 عصر
حوضه :حوزه ‎;)‎

rezakho
یک شنبه 22 تیر 1393, 23:02 عصر
شما باید از قفل ها (منظور کلیت عمل قفل هست) استفاده کنید به چند دلیل که مهمترینشون اینهاست

1- داده ها هنگام عملیات توسط سایرین دستکاری نشه
2- مطمئن بشید که کل عملیات با موفقیت انجام شده، و در غیر این صورت کل تغییرات به حالت قبل برگرده (مثلا پول کم بشه از کاربر ولی کالایی برای فروش وجو نداشته باشه)

از قفل ساده هم استفاده نکنید، چون این نوع قفل ها تمام رکوردهای جدول رو قفل میکنند، در صورتی که خیلی از عملیات ها با چند رکورد بیشتر کار ندارند و همچنین این قفل ها امکان بازگرداندن تغییرات رو ندارند، لذا باید از تراکنش ها استفاده کنید، چون هم امکان بازگرداندن تغییرات رو دارند و هم فقط رکورد رو قفل میکنند و نه همه جدول رو

i-php-i
دوشنبه 23 تیر 1393, 03:34 صبح
یه مثال از تراکنش مورد نیاز برای این کار می زنید؟