PDA

View Full Version : حرفه ای: اجراي کوئري فقط و فقط توسط يک در خواست کننده در آن واحد



imanitc
یک شنبه 28 اسفند 1390, 09:58 صبح
با سلام
من براي يک نرم افزاري که به افراد داوطلب شماره صندلي اختصاص ميده دچار مشکل شدم،برنامه به ازاي هر درخواست اخرين صندلي رو +1 ميکنه به فرد اختصاص ميده حالا اگر 2 نفر همزمان درخواست بدن شماره تکراري ميده .چطور ميتونم جلوي اينکار رو بگيرم ؟آيا استفاده از استور پروسيجر مفيد هست يا نه؟

farhadfery
یک شنبه 28 اسفند 1390, 10:16 صبح
به نظر من باید تبلت را در اون لحظه قفل بکنی.
http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html

imanitc
یک شنبه 28 اسفند 1390, 10:27 صبح
قبلا اينکار کردم
فقط ميشه جلوي رايت ميگيره من ميخام جلوي ريد بگيريم

MMSHFE
یک شنبه 28 اسفند 1390, 11:47 صبح
میتونید جدول رو قفل کنید تا جلوی دسترسی همزمان گرفته بشه. البته فکر میکنم در انجین InnoDB امکانات بهتری برای این کار در اختیار داشته باشین. میتونید موقع ثبت، با چک کردن داده های جدول، بررسی کنید که شماره تکراری نباشه و اگه بود، اینقدر به شماره اضافه کنه که دیگه تکراری نباشه و اون فیلد رو هم Unique کنید. اینطوری هرموقع عمل درج انجام شد، مطمئن خواهید بود که غیرتکراری هست و میتونید مقدار درج شده رو به کاربر نشون بدین. موفق باشید.

imanitc
یک شنبه 28 اسفند 1390, 11:58 صبح
با سلام

LOCK TABLES t1 READ;
اين کد فقط جلوي write روي تيبل ميگيره در صورتيکه من ميخام جلوي ريد بگيريم درمورد Unique کردن هم بايد بگم چون پارامتر هاي زيادي در دادن شماره دخيل هستن اين کار تقريبا غير ممکن من کل فرايند اختصاص شماره صندلي رو استور پروسيجر کردم نميدونم اينکار باعث ميشه که ديگه شماره تکراري نداشته باشم

AMIBCT
یک شنبه 28 اسفند 1390, 12:53 عصر
می‌تونید همزمان با خواندن مقدارها رو هم به جدول وارد کنید
INSERT INTO tbl
SELECT MAX( no ) + 1, 'a', 'b', 'c' FROM tbl

البته راه اصولی این است که عملیات را در یک Transaction انجام دهید که باید از جدول‌های InnoDB استفاده کنید

imanitc
سه شنبه 15 فروردین 1391, 09:33 صبح
ممنون
تيبيل من MyISAM ولي فکر کنم اين راه حل خوبي باشه