Что ** если (без ошибок) **? - PullRequest
1 голос
/ 02 марта 2012

Я пытаюсь реализовать транзакции в Kohana, но это не так просто, как в Spring / Java.

Пока я нашел этот код, чтобы попробовать, но я не знаю, как заменить деталь (без ошибок)

DB::query('START TRANSACTION');
// sql queries with query builder..

if (no errors)
    DB::query('COMMIT');
else
    DB::query('ROLLBACK');

Как мне сделать предложение if?

Ответы [ 4 ]

2 голосов
/ 02 марта 2012

Обычно транзакции обрабатываются так:

DB::query('START TRANSACTION');
try {
    //do something
    DB::query('COMMIT');
} catch (Exception $e) {
    DB::query('ROLLBACK');
}

Что это значит, если все будет успешно внутри блока try, отлично. Если какая-либо его часть не работает, она не достигнет commit и перейдет к блоку catch, который содержит rollback. Вы можете добавить больше обработки ошибок в catch, если хотите, даже выдать новое собственное исключение или бросить то же исключение, которое вы поймали.

1 голос
/ 02 марта 2012

Просто заверните все в блок try / catch:

DB::query('START TRANSACTION');
try {
    // sql queries with query builder..

    DB::query('COMMIT');
} catch (Database_Exception $e) {
    DB::query('ROLLBACK');
}
0 голосов
/ 02 марта 2012

Если вы используете Kohana 3:

$db = Database::instance();
$db->begin();
try
{
    // Do your queries here
    $db->commit();
}
catch (Database_Exception $e)
{
    $db->rollback();
}
0 голосов
/ 02 марта 2012

Ошибки БД преобразуются в исключения:

DB::query('START TRANSACTION');
try {
     // sql queries with query builder..
     DB::query('COMMIT');
}
catch($e)
{
    $this->template->body = new View('db_error');
    $this->template->body->error = 'An error occurred ...';
    DB::query('ROLLBACK');
}
...