如果DB :: transaction抛出错误,Laravel 5.3没有回滚?

时间:2017-01-11 06:44:47

标签: database laravel

我在进行多次查询时尝试进行数据库事务。

我还尝试在事务之外捕获异常,就像

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

当这里抛出一些异常时,事务似乎没有被回滚,数据库中的数据已被更改。

如果我在catch语句中手动执行DB::rollBack(),那么我的所有数据都没问题,

这让我觉得我必须手动做DB::rollBack()吗?

但我确实记得Laravel的文档说如果我使用DB::transaction来管理我的数据库查询,那么当异常抛出时,DB::rollBack()会自动执行吗?

Laravel 5.3已经改变了吗?

4 个答案:

答案 0 :(得分:3)

关注此link。您不应该使用DB::transaction(),而是将代码包装在DB::beginTransactionDB::commit/DB::rollback()

希望这对你有用!

答案 1 :(得分:2)

如果您有多个表条目并根据彼此进行更新。建议您使用事务

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

$ var_name在成功时返回null

有关详细信息,请参阅文档https://laravel.com/docs/5.3/database

希望这有助于你。 询问任何查询

答案 2 :(得分:0)

如果您这样实施,它将不会自动执行, 但如果你将它用作下面的闭包

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

它将自动回滚。

答案 3 :(得分: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();
}

目的是在您的查询失败时为您提供更好的控制。这样,您可以捕获异常并回滚事务。否则,您只需执行交易。