2017-01-11 2 views
2

Я попытался сделать транзакцию db, когда я сделал несколько запросов.Laravel 5.3 не откатывался, если DB :: transaction выдает ошибку?

, а также я пытался перехватывать исключения вне сделки так же, как

DB::transaction(function() { 
    try{ 
     //....db queries 
    }catch(\Exception $e){ 
     Log::info($e); 
    } 
}); 

, когда некоторые исключения, брошенные здесь, сделка кажется, не откат, то данные были изменены в базе данных.

Если я DB::rollBack() в заявлении уловов вручную, все мои данные будут в порядке,

это заставляет меня думать, что, если я должен сделать DB::rollBack() вручную?

но я помню, что документ Laravel сказал, что если я использую DB::transaction для управления моими db-запросами, когда исключены исключения, DB::rollBack() будет выполнен автоматически?

Было изменено в Laravel 5.3?

+0

также показать свой правильный код, чтобы сделать ваш вопрос более ясным – msonowal

+0

@msonowal Я просто хочу обсудить логику DB :: transaction, а не точный код. легко понять, о чем я говорю, если вы знаете Laravel, поэтому я не думаю, что мне нужно набирать так много кода, чтобы я понял. –

ответ

2

Следуйте за этим образом link. вы не должны использовать DB::transaction(), но вместо этого оберните свой код в DB::beginTransaction и DB::commit/DB::rollback()

Надейтесь, что эта работа для вас!

+0

, так ли я должен использовать DB :: beginTransaction, а не DB :: transaction? Если да, когда используется DB :: transaction? похоже, что DB :: transaction не требуется. –

+0

@AbelLee: Если вы хотите начать транзакцию вручную и иметь полный контроль над откатами и коммитами, вы можете использовать метод beginTransaction, [Docs] (https://laravel.com/docs/5.3/database#database -transactions). –

+0

Я просто хочу поймать исключения в транзакции, а также поведение начала транзакции будет выполнено. причина не всех транзакций абсолютно правильная. Если это так, транзакция DB :: не так лучше, чем DB :: beginTransaction –

0

не будет выполняться автоматически, если вы реализуете так, , но если вы используете его в качестве крышки, как показано ниже

DB::transaction(function() { 
    //db queries 
}); 

Это будет rollbacked автоматически.

+0

Я пробовал, что, как вы уже опубликовали, я даже не знаю, как DB :: rollBack() будет исключен, он просто выкинет код ошибки «500», если в транзакции DB :: произошли некоторые исключения. поэтому я хочу обернуть «try ... catch», чтобы сделать исключения удобными.И если я это сделаю, я обнаружил, что мне нужно DB :: rollBack() вручную :( –

+1

да, это то, что вы должны делать – msonowal

2

Если у Вас есть несколько записей таблицы и обновление в зависимости друг от друга .Это рекомендуется, что вы должны использовать транзакции

$var_name = DB::transaction(function() { 
// DB operations..... 
}); 

$ var_name возвращает нулевое значение в случае успешного

для получения более подробной информации, пожалуйста, обратитесь к документу https://laravel.com/docs/5.3/database

Надеюсь, это поможет. Спросите в случае любого запроса

+0

какая ошибка вы получаете –

+0

спасибо в расширенном, я прочитал документ, но Я думаю, что документ не так подробно. Он просто сказал мне, как использовать DB :: transaction, и DB :: rollBack() будет выполняться обычным способом транзакции, но я попытался ... поймать вручную, они никогда не упоминались –

+0

у вас может быть другая ошибка, потому что я сам работал над транзакцией db, и мне не нужно было пытаться поймать..пожалуйста, проверьте один раз –

0

Правильный путь с транзакциями и try/catch, как это:

try { 
    DB::transaction(function(){ 
     //your query stuff here 
    }); 

    DB::commit(); //transactions had no error 
} catch (\Exception $e) { 
    //transactions had an error 
    DB::rollback(); 

    //do something with $e->getMessage(); 
} 

Цель состоит в том, чтобы дать вам больший контроль в том случае, если ваши запросы неудачу. Таким образом, вы можете поймать исключение и отменить транзакцию. В противном случае вы просто выполните транзакцию.

Смежные вопросы