Laravel如何管理MySQL变量?

时间:2018-12-17 14:03:15

标签: php mysql laravel

如果我愿意

DB::statement("SET @foo := 1;");
DB::select("SELECT @foo;");

我在结果中得到了预期的1。但是我找不到任何地方可以保证结果。如果我正确理解变量是特定于MySQL连接。因此,由于某种原因,这两个语句可能会在不同的连接上执行,而我会得到不同的结果吗?我可以依靠它来始终工作吗?

2 个答案:

答案 0 :(得分:0)

您需要了解有关laravel的一件事,它在脚本结束后会断开连接,因为它不使用持久连接来避免这种情况

  

与其他任何PHP数据库一样,使用PDO存在相同的缺点   进行持久连接的接口:如果脚本终止   在数据库操作中间意外地,下一个请求   剩下的连接会从死脚本中获取   离开。

只要您正在执行的语句在同一脚本中并且每次都运行在一起,您就可以依靠返回的结果,一旦脚本结束,变量将被删除。

希望这可以为您清理一切。

答案 1 :(得分:0)

要确保两个语句始终作为一个语句执行,可以使用database transactions

DB::transaction(function () {
    DB::statement("SET @foo := 1;");
    DB::select("SELECT @foo;");
});

这保证了每笔交易都被视为一个单独的“单位”(atomicity)。 有两种可能:两个语句都作为一个语句执行,或者如果发生故障,则完全不执行语句。

下一个保证是:这两个语句都是在 isolation 中执行的,这意味着如果您同时执行此代码,则始终可以保证事务是按顺序执行的。