我在进行多次查询时尝试进行数据库事务。
我还尝试在事务之外捕获异常,就像
一样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已经改变了吗?
答案 0 :(得分:3)
关注此link。您不应该使用DB::transaction()
,而是将代码包装在DB::beginTransaction
和DB::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();
}
目的是在您的查询失败时为您提供更好的控制。这样,您可以捕获异常并回滚事务。否则,您只需执行交易。