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

标签 php laravel laravel-5 transactions

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

相关文章:

php - Symfony2 递归查询生成器

php - 有没有办法为 Zend_Form 元素名称添加前缀?

laravel - 外键不匹配 - "password_resets"在 dropColumn 上引用 "users"

php - Laravel:MySQL 查询在一段时间后变得更慢。可能的原因有哪些?

php - Laravel 4 中的自定义验证

php - Laravel 保存()未定义

mysql - 如何按属性拆分 Eloquent 关系结果并仅进行计数

php - wordpress posts_orderby 过滤器与插件中的自定义表

php - 在框架上跟踪 php 进程

php - Laravel 请求转换