如果我愿意
DB::statement("SET @foo := 1;");
DB::select("SELECT @foo;");
我在结果中得到了预期的1
。但是我找不到任何地方可以保证结果。如果我正确理解变量是特定于MySQL连接。因此,由于某种原因,这两个语句可能会在不同的连接上执行,而我会得到不同的结果吗?我可以依靠它来始终工作吗?
答案 0 :(得分:0)
您需要了解有关laravel的一件事,它在脚本结束后会断开连接,因为它不使用持久连接来避免这种情况
与其他任何PHP数据库一样,使用PDO存在相同的缺点 进行持久连接的接口:如果脚本终止 在数据库操作中间意外地,下一个请求 剩下的连接会从死脚本中获取 离开。
只要您正在执行的语句在同一脚本中并且每次都运行在一起,您就可以依靠返回的结果,一旦脚本结束,变量将被删除。
希望这可以为您清理一切。
答案 1 :(得分:0)
要确保两个语句始终作为一个语句执行,可以使用database transactions:
DB::transaction(function () {
DB::statement("SET @foo := 1;");
DB::select("SELECT @foo;");
});
这保证了每笔交易都被视为一个单独的“单位”(atomicity)。 有两种可能:两个语句都作为一个语句执行,或者如果发生故障,则完全不执行语句。
下一个保证是:这两个语句都是在 isolation 中执行的,这意味着如果您同时执行此代码,则始终可以保证事务是按顺序执行的。