Можно ли откатить транзакцию после ее фиксации с помощью Datamapper / Codeigniter? - PullRequest
1 голос
/ 26 августа 2011

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

Одна вещь, которую я нашел интересной, это этот ответ .Есть ли что-то похожее на точку сохранения в Datamapper / Codeigniter?

1 Ответ

4 голосов
/ 26 августа 2011

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