Могу ли я откатить транзакцию после ее фиксации с помощью Datamapper/Codeigniter?

Можно ли откатить транзакцию после ее фиксации? Я спрашиваю об этом, потому что в документации Datamapper я вижу метод trans_begin(), но не нашел метод trans_end(). Codeigniter имеет метод trans_complete(), поэтому я предположил, что Datamapper может иметь аналогичный метод.

Мне показалось интересным следующее: этот ответ. Есть ли что-то похожее на точку сохранения в Datamapper/Codeigniter?


person Jorge Guberte    schedule 26.08.2011    source источник


Ответы (1)


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() и 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();
}
person Wesley Murch    schedule 26.08.2011