ট্রানজেকশন সঠিকভাবে ব্যবহার করা

webman-এ ডাটাবেস ট্রানজেকশন অন্যান্য ফ্রেমওয়ার্কের মতোই ব্যবহার করা হয়। এখানে খেয়াল করার বিষয়গুলি তুলে ধরা হলো।

কোড স্ট্রাকচার

কোড স্ট্রাকচার অন্যান্য ফ্রেমওয়ার্কের (যেমন Laravel, think-orm) মতোই:

Db::beginTransaction();
try {
    // ..ব্যবসায়িক লজিক বাদ দেওয়া...

    Db::commit();
} catch (\Throwable $exception) {
    Db::rollBack();
}

গুরুত্বপূর্ণ: \Exception না দিয়ে অবশ্যই \Throwable ব্যবহার করতে হবে, কারণ ব্যবসায়িক প্রসেসিং চলাকালে Error ট্রিগার হতে পারে যা Exception উত্তরাধিকারী নয়।

ডাটাবেস কানেকশন

ট্রানজেকশনের মধ্যে মডেল অপারেট করার সময় মডেলে কানেকশন সেট আছে কিনা খেয়াল রাখুন। মডেলে কানেকশন নির্দিষ্ট থাকলে ট্রানজেকশন শুরু করার সময় সেই কানেকশন নির্দিষ্ট করতে হবে, নাহলে ট্রানজেকশন কার্যকর হবে না (think-orm এর মতো)। উদাহরণ:

<?php

namespace app\model;
use support\Model;

class User extends Model
{

    // এখানে মডেলের জন্য কানেকশন নির্দিষ্ট করা হয়েছে
    protected $connection = 'mysql';

    protected $table = 'users';

    protected $primaryKey = 'id';

}

মডেলে কানেকশন নির্দিষ্ট থাকলে begin, commit ও rollback সব ক্ষেত্রে কানেকশন নির্দিষ্ট করতে হবে:

Db::connection('mysql')->beginTransaction();
try {
    // ব্যবসায়িক প্রসেসিং
    $user = new User;
    $user->name = 'webman';
    $user->save();
    Db::connection('mysql')->commit();
} catch (\Throwable $exception) {
    Db::connection('mysql')->rollBack();
}

কমিট হয়নি এমন ট্রানজেকশন যুক্ত রিকোয়েস্ট খুঁজে বের করা

কখনো ব্যবসায়িক কোডের বাগের কারণে কোনো রিকোয়েস্টের ট্রানজেকশন কমিট হয় না। কোন কন্ট্রোলার মেথড ট্রানজেকশন কমিট করেনি তা দ্রুত বের করতে webman/log কম্পোনেন্ট ইনস্টল করা যেতে পারে। এই কম্পোনেন্ট প্রতিটি রিকোয়েস্ট শেষে অটোমেটিক চেক করে কমিট হয়নি এমন ট্রানজেকশন আছে কিনা এবং লগে লিখে। লগের কীওয়ার্ড হলো Uncommitted transactions

webman/log ইনস্টল করার পদ্ধতি

composer require webman/log

সাবধান
ইনস্টলের পর restart দিয়ে পুনরায় চালু করতে হবে, reload কাজ করবে না