1

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

我发现有趣的一件事是这个答案。有什么类似于 Datamapper/Codeigniter 中的保存点的东西吗?

4

1 回答 1

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

trans_end()Codeigniter 或 Datamapper 中都不存在方法。您可以使用trans_start()andtrans_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();
}
于 2011-08-26T17:50:58.123 回答