gpt4 book ai didi

php - 如果在 laravel5 中调用 DB::beginTransaction 而没有使用 DB::commit() 会发生什么?

转载 作者:行者123 更新时间:2023-12-04 03:15:37 28 4
gpt4 key购买 nike

正常,在使用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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com