सही तरीके से लेनदेन का उपयोग करें

webman का डेटाबेस लेनदेन का उपयोग अन्य फ्रेमवर्क की तरह ही है, यहां कुछ आवश्यक बातों का उल्लेख किया गया है।

कोड संरचना

कोड संरचना अन्य फ्रेमवर्क के समान है, जैसे कि Laravel उपयोग (think-orm समान)

Db::beginTransaction();
try {
    // ..व्यापार प्रक्रिया略...

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

यहां विशेष ध्यान देने की आवश्यकता है कि आपको \Throwable का उपयोग करना चाहिए और \Exception का उपयोग नहीं करना चाहिए, क्योंकि व्यावसायिक प्रक्रिया के दौरान Error को ट्रिगर किया जा सकता है, जो कि Exception में नहीं आता है।

डेटाबेस कनेक्शन

जब लेनदेन में मॉडल का संचालन किया जाता है, तो विशेष ध्यान देना चाहिए कि क्या मॉडल ने कनेक्शन सेट किया है। यदि मॉडल ने कनेक्शन सेट किया है, तो लेनदेन शुरू करते समय उसे निर्दिष्ट करना चाहिए, अन्यथा लेनदेन अमान्य हो जाएगा (think-orm समान)। उदाहरण के लिए

<?php

namespace app\model;
use support\Model;

class User extends Model
{

    // यहां मॉडल को कनेक्शन निर्दिष्ट किया गया है
    protected $connection = 'mysql';

    protected $table = 'users';

    protected $primaryKey = 'id';

}

जब मॉडल ने कनेक्शन निर्दिष्ट किया है, तब लेनदेन शुरू करना, लेनदेन को समर्पित करना, और लेनदेन को रोलबैक करना चाहिए कि कनेक्शन निर्दिष्ट किया गया हो।

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 प्रभावी नहीं होगा।