是否可以在事务提交后回滚?我问这个问题是因为在Datamapper文档中,我看到了trans_begin()
方法,但我没有找到trans_end()
方法。Codeigniter有trans_complete()
方法,所以我假设Datamapper可能有类似的方法。
http://datamapper.wanwizard.eu/pages/transactions.htmlDataMapper处理事务的方式与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();
}