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:

$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
Yuqoridagi ketma-ketlikni kod orqali quidagica yozish mumkin:
$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. Manba:


JONNY

Muallif haqida

JONNY Arduino, Java, C#, Android, Windows, Linux, Debian, Javascript. O'zbekistonni rivojlantiramiz! Dasturlash orqali vatanimizni yangi marralarga olib chiqamiz.


Blogdagi so‘nggi maqolalar:


Birinchi bo‘ling!

Iltimos, fikr bildirish uchun saytga kiring yoki ro‘yxatdan o‘ting!