如何使用 codeigniter 中的事务进行基于数据更改的提交和回滚?

Posted

技术标签:

【中文标题】如何使用 codeigniter 中的事务进行基于数据更改的提交和回滚?【英文标题】:how to use transactions in codeigniter for commit and rollback based on data change? 【发布时间】:2017-06-26 23:38:18 【问题描述】:

我想了解如何使用 MYSQL TRANSACTIONS

我有两个表的用例。假设表 1 和表 2。现在我在 Table1 中插入一些数据,我从该表中得到的 insert id 我想将其插入到表 2 中。

如果值成功插入到 Table1 中,并且在插入 Table2 值期间如果发生任何错误,我也想从 Table1 中删除值,因为对我的 Table2 的查询不成功。

我只是想了解如何使用 Codeigniter 来完成这项工作。 如何根据需要 COMMIT 或 ROLLBACK。

请帮助我理解一些示例代码。

更新

我还参考了 Codeigniter 用户指南。但是我没看懂Running Transactions manually这个概念是什么意思?如上所述,我想做一些自动的触发器,我的意思是如果我的查询失败,我希望它使用 Codeigniter 回滚它所做的一切。

代码:

$this->db->trans_begin();
$data = $this->Product_m->array_from_post(array('name','description'));
$this->Product_m->save($data,$id);
$pid = $this->db->insert_id();

$num_of_license = $_POST['license'];

$this->Product_m->create_product($pid,$num_of_license);
    if ($this->db->trans_status() === FALSE)
    
            $this->db->trans_rollback();
    
    else
    
            $this->db->trans_commit();
    

现在在这种情况下,我尝试这样做:

这条语句$this->Product_m->create_product($pid,$num_of_license);根据前面的save()方法插入数据,现在假设create_product()方法发生了一些错误。然后我想回滚。我想删除 save() 方法所做的记录。

【问题讨论】:

Codeigniter Transactions的可能重复 这不是重复,他只是要求提供在 codeigniter 中完成的交易的参考 @dhruvjadia 我已经提到过这个问题,但它专门针对他的代码,我只是想了解如何以不同的方式使用它,我还提到我想“学习”跨度> 【参考方案1】:

使用以下步骤。

1.使用$this->db->trans_begin();开始您的交易。

2.执行查询。

3.使用$this->db->trans_status()检查交易状态。

4.如果status为真commit事务使用$this->db->trans_commit();

5.如果status为假rollback事务使用$this->db->trans_rollback();

$this->db->trans_begin();

$this->db->query('AN SQL QUERY...');
$this->db->query('ANOTHER QUERY...');
$this->db->query('AND YET ANOTHER QUERY...');

if ($this->db->trans_status() === FALSE)

        $this->db->trans_rollback();

else

        $this->db->trans_commit();

有关更多信息,请参阅文档Codeigniter Transaction

【讨论】:

你能解释一下这个用例场景吗,我插入一条记录并基于该记录插入另一条记录,但是如果发生错误,我想在第二个表中插入第二个记录时,我什至想删除第一个我插入的记录 将 $this->db->trans_rollback();删除本次交易的所有记录? 是的 ..在trans_begin 之后执行的所有查询都将被回滚。你有没有按照上面的步骤尝试过。 可以请检查我尝试过使用此更新的问题,但是当我的第二个查询失败时,它不会回滚保存方法的查询!我该怎么做 是的,我试过了,但是回滚不起作用,假设我的第二种方法有一个 db 错误,所以我想回滚,我想删除插入的 save() 方法

以上是关于如何使用 codeigniter 中的事务进行基于数据更改的提交和回滚?的主要内容,如果未能解决你的问题,请参考以下文章

Codeigniter,事务中的错误跟踪

如何获取 Codeigniter 中模型之间事务中关系的最后一个 ID?

Ion Auth (Codeigniter) - 如何使用不同的数据库

CodeIgniter - 使用事务插入多个表

如何在codeigniter中查看基于链接ID的所有数据

使用 CodeIgniter 事务?