【问题标题】:transaction doesn't work on truncate事务在截断时不起作用
【发布时间】:2016-12-13 07:00:57
【问题描述】:

我第一次尝试 Laravel 事务...我使用 Eloquent 进行大部分查询,由于那里没有事务,我必须混合使用 Eloquent 和查询构建器。

这是我的代码:

DB::beginTransaction();

try{
    Setting::truncate();
    Setting::insert($data);
    DB::commit();
    jok('all ok');

}
catch (\Exception $e)
{
    DB::rollback();
    jerror('some error accorded! ');
}

所以我已经绑定到设置中添加一些无效数据,我得到了some error accorded 错误,但在 INSERT Setting::truncate(); 之前的查询无论如何都执行了,我最终得到了一个空表。

所以要么我做错了,要么事务在截断时不起作用。

【问题讨论】:

  • 我在服务器端有同样的情况

标签: laravel transactions laravel-5.2


【解决方案1】:

数据库事务中的 TRUNCATE TABLE 将导致隐式 COMMIT 操作。 DELETE 没有相同的行为,因此您可以安全地运行

DELETE FROM tblname

这将清除您的表并仍然保留事务的所需回滚功能。

请参阅有关 TRUNCATE 的 MySQL 文档。项目符号解释了这个功能http://dev.mysql.com/doc/refman/5.7/en/truncate-table.html

【讨论】:

    【解决方案2】:

    delete 的更好解决方案是使用 Model 方法:

    Setting::query()->delete();
    

    【讨论】:

    • 为什么这是一个更好的解决方案?
    • 嗨,有两个原因:1. 它使用 Eloquent 类而不是原始 SQL,2. truncate 不会在事务中回滚,但 delete 是
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    相关资源
    最近更新 更多