正常,在使用DB::beginTransaction()
时,与DB::rollBack()
一起使用
像这样:
DB::beginTrnsaction();
try {
DB::insert(...);
DB::insert(...);
DB::insert(...);
DB::commit();
// all good
} catch (\Exception $e) {
DB::rollback();
// something went wrong
}
但是,如果我忘记添加 try catch 循环怎么办?
即
DB::beginTrnsaction();
DB::insert(...);
DB::insert(...);
DB::insert(...);
DB::commit();
如果其中一个插入出错,数据库会被更改吗?还是会自动回滚?
最佳答案
如果您启动了一个事务,但从未提交或回滚,则当与数据库的连接关闭时,该事务将自动回滚。
对于大多数 PHP 页面,这不是什么大问题,因为连接通常会在请求完成后关闭。
但是,如果您使用的是持久连接,这就会成为一个问题。使用持久连接时,与数据库的连接不会在请求完成时结束。连接返回到连接池中,仍然有效,并且事务仍然打开。在事务仍然打开的情况下,记录上的锁仍然处于事件状态,这可能会阻止在后续请求中访问这些记录,直到连接终止并且流氓事务可以回滚。
就交易而言,它们的生命周期越短越好。您希望事务存活的时间足够长以完成您的工作单元,但您不希望它存活的时间超过此时间。一旦您可以提交或回滚以完成事务,其他进程等待锁定这些记录的时间就越少。这确实会影响大容量网站。
您可以做的一件事是在传递给 transaction()
方法的 Closure
中完成您的工作,从而摆脱您自己的责任。这将自动处理事务的启动和提交/回滚。
DB::transaction(function () {
DB::insert(...);
DB::insert(...);
DB::insert(...);
});
如果在Closure
中抛出任何Exception
,事务将被回滚。否则,事务将提交。
关于php - 如果在 laravel5 中调用 DB::beginTransaction 而没有使用 DB::commit() 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41295252/