Codeigniter Transactions

我正在使用Codeigniter交易

$this->db->trans_start();
$this->db->query('AN SQL QUERY...');
$this->db->trans_complete();

这工作正常,我遇到的问题是,在内部,我正在调用其他函数,这些函数处理数据库,因此它们包含插入和更新以及一些删除...前任:trans_starttrans_complete

$this->db->trans_start();
 $this->utils->insert_function($data);
 $this->utils->update_function2($test);
$this->db->trans_complete();

现在,如果执行了这些函数并且发生了一些错误,CodeIgniter将不会执行回滚。

处理此类问题的最佳方法是什么?

我想到的唯一解决方案是从这些函数返回错误,并在这些函数内部添加( 和 )如果它返回错误测试,则执行trans_stattrans_complete$this->db->trans_rollback

前任:

    $this->db->trans_start();
     $result = $this->utils->insert_function($data);
     if($result === false){
       $this->db->trans_rollback();
     }
    $this->db->trans_complete();

有没有更好的方法来做到这一点?

更新 1:

根据要求,我正在调用的外部函数的示例:

   // insert_function contains

    $rec = array(
        'numero' => $numero,
        'transaction_id' => $id,
        'debit' => $product_taxes['amount_without_taxes'],
        'date' => $data['date_transaction'],
    );
    $this->addExerciceAccountingRecords($rec);

  and addExerciceAccountingRecords contains

   function addExerciceAccountingRecords($records) {
    $this->db->insert('transactions_exercices', $records);
    }

答案 1

使用手段支持数据库安全地插入数据。因此,在Codeigniter中,我们在模型中而不是在控制器中编写每个与数据库相关的函数。在你的第二个代码(不起作用)中,你有指向那里的模型。(实用工具)。这么简单,我相信这行不通。因为它不是与模型和控制器并行的插入数据。事务应该在模型中编码(我将在我的答案中写在模型中)。transactions


也加载这些东西

  1. 数据库元器件库
  2. 模型类
  3. 网址帮助程序
  4. 会期

假设

在代码中,您已使用和作为数组。所以我假设有两个数组用于插入和更新数据。$data$test


您的数据集

$data = array(
   'title' => 'My title' ,
   'name' => 'My Name' ,
   'date' => 'My date'
);

$id = 007;
$test = array(
   'title' => $title,
   'name' => $name,
   'date' => $date
);

您的代码

$this->db->trans_start(); # Starting Transaction
$this->db->trans_strict(FALSE); # See Note 01. If you wish can remove as well 

$this->db->insert('table_name', $data); # Inserting data

# Updating data
$this->db->where('id', $id);
$this->db->update('table_name', $test); 

$this->db->trans_complete(); # Completing transaction

/*Optional*/

if ($this->db->trans_status() === FALSE) {
    # Something went wrong.
    $this->db->trans_rollback();
    return FALSE;
} 
else {
    # Everything is Perfect. 
    # Committing data to the database.
    $this->db->trans_commit();
    return TRUE;
}

笔记

  1. 默认情况下,Codeigniter 在严格模式下运行所有事务。启用严格模式,如果正在运行多个事务组,则如果一个组失败,则所有组都将回滚。如果禁用严格模式,则每个组将独立处理这意味着一个组的故障不会影响任何其他组

答案 2

我尝试的更像是一个技巧,但它对我有用。

$this->db->trans_begin();
  $rst1=  $this->utils->insert_function($data);
  $rst2 =  $this->utils->update_function2($test);
if($this->db->trans_status() === FALSE || !isset($rst1) || !isset($rst2)){
   $this->db->trans_rollback();
}else{
   $this->db->trans_commit();
}

推荐