在交易期间,我能否使用更新后(但尚未提交)的值?

During a transaction, am I able to use the updated (but not yet committed) values?

我很可能把这个复杂化了。我对 MySQL 相当有信心,但以前从未使用过事务。我知道这个概念是 begin(),在失败时做一些事情,commit()rollback(),我很确定我可以轻松地构建它。

我想知道的是在交易期间我想更新 table 然后在同一交易期间在另一个查询中使用更新后的值。大纲如下:

begin()
INSERT
SELECT FROM INSERT
UPDATE BASED ON SELECT
commit()

显然我已经精简了这里的代码,这本身没有任何意义。在我深入研究事务并发现它不起作用之前,我想知道这个概念是否有效。

我的实际交易将大 5 倍左右,其中一部分依赖于上述未完成交易的其他部分。

我正在使用 Laravel 所以我的代码使用 DB::beginTransaction() DB::commit()DB::rollback() 如果这对问题有任何影响的话。

所以,简单的答案是肯定的。

我运行用我一直在开发的代码进行了多次测试,这就是状态,至少在我的情况下是这样。

DB::beingTransaction()

现在我们做我们的事。此处的所有陈述相互关联并按顺序执行。

DB::commit()

然后运行所有语句只要模拟运行通过是成功的

DB::rollback()

在 try catch 块中更改可能失败的所有方法都会调用此方法

所以让我提供一个工作(简化)Laravel示例来演示基础知识:

public function store(Request $request)
{
    DB::beginTransaction();

    try
    {
        if(!$this->setAuthorisation($request))
            throw new Exception('Failed to set authorisation');

        DB::commit();
        return response()->json(['status' => 'OK'], 200);
    }
    catch (Exception $exception)
    {
        DB::rollBack();
        return response()->json(['status' => 'Failed', 'error'=>$exception->getMessage()], 500);
    }
}

现在从这里我们可以访问在 setAuthorisation() 方法中所做的更改,比如在 getAuthorisation() 方法中,然后将 $data = getAuthorisation() 中的数据应用于另一组代码,例如在 setData($data).

整个 t运行saction 在提交之前按照模拟事件的顺序工作,因此 "applies" 更改在 "actually applying" 更改之前。真的很难解释更多,所以我希望这能回答我自己的问题。