php - लेन-देन कोडिंगिनीटर में रोलबैक नहीं कर सकता




mysql codeigniter (4)

उत्तर अपडेट किया गया!

मुझे आपको बताना होगा कि कोडिगनिटर के कॉन्फ़िग का डिफ़ॉल्ट रूप से सभी लेन-देन स्वचालित रूप से प्रतिबद्ध हैं I

अगर किसी भी कारण से आप इस फ़ंक्शन को अक्षम करना चाहते हैं तो आपको इस लाइन का उपयोग करना होगा:

$this->db->trans_off();    

इससे पहले

$this->db->begin();

कहा था, इसलिए जब आप उपयोग करते हैं

$this->db->trans_complete();

आपको ऐसा करना या रोलबैक करने की आवश्यकता होगी:

$result = $this->db->trans_complete();

if($result === true){
    $this->db->trans_commit();
}else{
    $this->db->trans_rollback();
}

अंत में आप क्या चाहते हैं:

$this->db->trans_off();

$this->db->query("insert this...");
$this->db->query("insert that...");

$result = $this->db->trans_complete();

if($result === true){
    $this->db->trans_commit();
}else{
    $this->db->trans_rollback();
}

मैं लेनदेन पर काम कर रहा हूं, और उल्लिखित कोड में मुझे कुछ समस्या का सामना करना पड़ा। मैंने लेनदेन नहीं किया, लेकिन यह मेरे डेटाबेस में डेटा डाला।

$this->db->trans_begin();
$this->db->insert('tblorder',$data);
$orderid=$this->db->insert_id();
foreach ($orderItemList as $orderItemList) {
    $orderitem = array('orderid' =>$orderid ,'productid' =>$orderItemList->productid ,'amount' =>$orderItemList->amount);
    $this->db->insert('tblorderitem',$orderitem);
}
$this->db->trans_complete();

if ($this->db->trans_status() == 1) {
    $this->db->trans_rollback();
    return "true";
} else {
    $this->db->trans_commit();
    return "false";
}

मैंने वापस लेनदेन वापस लाया, और फिर मेरे डाटाबेस में सभी डेटा डाला गया था। क्या समस्या होनी चाहिए? मुझे यह नहीं मिल सकता है


जैसा कि मैं सीआई संस्करण 3.0.1 के लिए जानता हूँ केवल एक चीज है जिसे आपको चिंता करनी चाहिए कि यह $this->db->trans_start(); डाल करने के लिए है $this->db->trans_start(); और $this->db->trans_complete();

इसलिए जैसी परिस्थितियों के लिए:

$this->db->trans_start();
//any code goes here
$this->db->trans_complete();

कुछ गलत हो जाने पर लेन-देन वापस लाया जाएगा, या कॉल के लिए $this->db->trans_complete();

क्योंकि यदि आप trans_start विधि के हुड के नीचे देखते हैं तो इसमें ट्रांस_बेगिन होता है और trans_complete विधि में trans_status के लिए जांच होती है और तदनुसार trans_commit या trans_rollback विधियों के लिए कॉल करता है

नेस्टेड लेनदेन के लिए भी यही लागू होता है:

$this->db->trans_start();
//any code goes here
$this->db->trans_start();
//any code goes here
$this->db->trans_complete();
//any code goes here
$this->db->trans_complete();

डिफ़ॉल्ट रूप से, Codeigniter सभी लेनदेन को सख्त मोड में चलाता है इसलिए अंतिम trans_complete सभी किया जाएगा, या यदि सभी कुछ रोलबैक विफल हो जाएंगे।


आपके द्वारा लिखा गया कोड बहुत ही उतना ही है जितना कि स्वचालित लेन-देन लिखे गए हैं - केवल उतना ही नहीं। मेरी सलाह? CodeIgniter चकमा देने की कोशिश मत करो, लेनदेन के लिए "स्वचालित" मोड का उपयोग करें। फिर यदि आवश्यक हो तो रोलबैक, आपके लिए देखभाल की जाएगी।

मैंने स्वचालित लेन-देन मोड का उपयोग करके अपने कोड को दोबारा बनाया है। मैं $orderItemList से डेटा भी इकट्ठा करता $orderItemList इसलिए इसे एक बैच का उपयोग करके db->insert एक लूप में db->insert बजाय सम्मिलित किया जा सकता है

$this->db->trans_start();
$this->db->insert('tblorder', $data);
$orderid = $this->db->insert_id();
foreach($orderItemList as $orderItem)
{
    $orderedItems[] = [
      'orderid' => $orderid,
      'productid' => $orderItem->productid,
      'amount' => $orderItem->amount
    ];
}
if(isset($orderedItems))
{
    $this->db->insert_batch('tblorderitem', $orderedItems);
}
$this->db->trans_complete();
$this->db->trans_status();

इसे अवश्य पसंद करें। यदि आप लेन-देन के बारे में अधिक जानने के लिए चाहते हैं तो मेरा उत्तर दूसरे प्रश्न पर देखें । इससे आपको लेनदेन के बारे में एक स्पष्ट अनुमान प्राप्त करने में मदद मिलती है।

$this->db->trans_begin();

$this->db->insert('tblorder',$data);
$orderid=$this->db->insert_id();

$orderitem = array();

foreach ($orderItemList as $orderItemList) 
{
    $orderitem[] = array('orderid' =>$orderid ,'productid' =>$orderItemList->productid ,'amount' =>$orderItemList->amount);
}

$this->db->insert_batch('tblorderitem', $orderitem); 

$this->db->trans_complete();

if ($this->db->trans_status() === FALSE) 
{
    $this->db->trans_rollback();
    return FALSE;
} 
else 
{
    $this->db->trans_commit();
    return TRUE;
}




codeigniter-3