在使用Datamapper / Codeigniter提交事务后,我可以回滚事务吗?

时间:2011-08-26 17:30:49

标签: php database codeigniter transactions codeigniter-datamapper

是否可以在提交事务后回滚事务? 我问这个是因为在Datamapper文档中我看到trans_begin()方法,但我没有找到trans_end()方法。 Codeigniter有trans_complete()方法,所以我假设Datamapper可能有类似的方法。

我发现有趣的一件事是this answer。在Datamapper / Codeigniter中是否有类似于保存点的内容?

1 个答案:

答案 0 :(得分:4)

  

http://datamapper.wanwizard.eu/pages/transactions.html

     

DataMapper以非常相同的方式处理事务   CodeIgniter做了(读CodeIgniter Transactions),显然是因为它   使用相同的方法!唯一真正的区别在于你会成为   直接在DataMapper对象上调用事务方法。

这意味着代替:

$this->db->trans_begin();

您将使用:

$my_datamapper_object->trans_begin();

根据Datamapper文档,其他所有内容在事务方面与Codeigniter相同。如果查看Datamapper库的源代码,您会发现所有trans_*()调用都只是包装函数。例如:

// Datamapper.php 1.8.dev line 3975
/**
 * Trans Complete
 *
 * Complete a transaction.
 *
 * @return  bool Success or Failure
 */
public function trans_complete()
{
    return $this->db->trans_complete();
}

Codeigniter或Datamapper中不存在trans_end()方法。您可以使用trans_start()trans_complete()进行自动交易,也可以手动调用它们:

  

http://codeigniter.com/user_guide/database/transactions.html

     

手动运行交易

     

如果您想手动运行交易,可以这样做   如下:

$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();
}

只需将$this->db替换为您的Datamapper对象即可。例如。

$u = new User($id);
$u->trans_begin();
$u->name = 'Jorge';
$u->save();

if ($u->trans_status() === FALSE)
{
    $u->trans_rollback();
}
else
{
    $u->trans_commit();
}