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トランザクションを読み取ります)。これは、明らかに同じメソッドを使用しているためです。唯一の本当の違いは、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();
}

メソッドはCodeignitertrans_end()にもDatamapperにも存在しません。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->dbDatamapperオブジェクトに置き換えるだけです。例えば。

$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 に答える