如果我这样做
DB::statement("SET @foo := 1;");
DB::select("SELECT @foo;");
我在结果中得到了预期的 1
。但我无法在任何地方找到它是否是一个保证的结果。如果我理解正确的话,这些变量是特定于 MySQL 连接的。那么是否有可能由于某种原因这两个语句将在不同的连接上执行并且我会得到不同的结果?我可以依靠它一直工作吗?
最佳答案
为确保两条语句始终作为一条语句执行,您可以使用 database transactions :
DB::transaction(function () {
DB::statement("SET @foo := 1;");
DB::select("SELECT @foo;");
});
这保证了每笔交易都被视为一个“单元”(atomicity)。 有两种可能性:两个语句都作为一个语句执行,或者如果发生故障,则根本不执行任何语句。
下一个保证是:两个语句都在隔离中执行,这意味着如果您同时执行此代码,则始终保证事务按顺序执行。
关于php - Laravel 是如何管理 MySQL 变量的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53816844/