YIi da ma’lumotlar bazasi tranzaksiyalari bilan ishlash
Ma’lumotlar bazasi bilan ishlayotganimizda ba’zida ma'lumotlar bazasiga bir vaqtning o’zida minglab so’rov yuborishga to’g’ri keladi. Bugun men shu holatga duch keldim. Ya’ni, jadvaldagi bir ustundagi ma’lumotga murojat qilib, undagi qiymatni mos xolda kerakli qiymatga o’zgartirishga to’g’ri keldi. Jadvaldagi qatorlar soni 2000 dan ortiqroq. Dastlab quidagi usulni ishlatib ko’rdim:
Natijada quidagi xato chiqdi:
Bu xato ko'pchilik web-dasturchilarga ma'lum. Sabab, bajarilayotgan kodni bajarilish vaqti ko’payib ketganida. Buni php.ini faylidan uzaytirib qo’yish mummkin lekin muammoni hal qilmaydi. Chunki, siklda 2000 ta so’rov yuborilyapdi va bu uzoq vaqt oladi. Buni hal qilish uchun ma'lumotlar bazasi tranzaksiyalaridan foydalanamiz.
Tranzaksiyadan foydalanish
Ma’lumotlar bazasida tranzaksiya tushunchasi MB bilan operatsiyalarning mantiqiy birligi bo’lib – ma’lumotlarni o’qish yoki “update” qilish uchun foydalanuvchi tomonidan yuborilgan so’rovlarni “bir butun” bajarishidir.
Tranzaksiya jarayonini quidagi 4 bosqichga bo'lish mumkin:
Yuqoridagi kodni bajarishga atigi 2-3 soniya vaqt ketdi.
$model=UserMeta::model()->findAll();
foreach($model as $v){
UserMeta::model()->updateByPk($v->id,array("seat_date"=>"1111-11-11"));
}
Natijada quidagi xato chiqdi:
Fatal error: Maximum execution time of 30 seconds exceeded in ...
Bu xato ko'pchilik web-dasturchilarga ma'lum. Sabab, bajarilayotgan kodni bajarilish vaqti ko’payib ketganida. Buni php.ini faylidan uzaytirib qo’yish mummkin lekin muammoni hal qilmaydi. Chunki, siklda 2000 ta so’rov yuborilyapdi va bu uzoq vaqt oladi. Buni hal qilish uchun ma'lumotlar bazasi tranzaksiyalaridan foydalanamiz.
Tranzaksiyadan foydalanish
Ma’lumotlar bazasida tranzaksiya tushunchasi MB bilan operatsiyalarning mantiqiy birligi bo’lib – ma’lumotlarni o’qish yoki “update” qilish uchun foydalanuvchi tomonidan yuborilgan so’rovlarni “bir butun” bajarishidir.
Tranzaksiya jarayonini quidagi 4 bosqichga bo'lish mumkin:
- Tranzaksiyani boshlash
- So’rovlarni birma-bir bajarish. Bunda bazadagi o'zgarishlar ko'rinmaydi.
- Transaksiyani tasdiqlash(commit). Agar tranzaksiya muvaffaqiyatli tugasa, o’zgarishlarni ko’rish mumkin.
- Agar bir so’rov xato bo’lsa, butun tranzaksiya to’xtaydi
$model = User::model()->findAll();
$connection = Yii::app()->db;
$transaction = $connection->beginTransaction();
try {
foreach ($model as $v) {
$sql = "update user_meta set seat_date='2222222' where id='".$v->id."'";
$connection->createCommand($sql)->execute();
}
$transaction->commit();
} catch (Exception $e) { // agar so’rov xato bo’lsa, exceptionga keladi
$transaction->rollBack();
}
Yuqoridagi kodni bajarishga atigi 2-3 soniya vaqt ketdi.
yuqorida ishlatilgan kodni o'rniga
ishlatish yaxshiroq va qisqarog