【问题标题】:During a transaction, am I able to use the updated (but not yet committed) values?在事务期间,我是否能够使用更新(但尚未提交)的值?
【发布时间】:2020-06-09 13:45:23
【问题描述】:

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

我想知道的是在事务期间我想更新一个表,然后在同一事务期间在另一个查询中使用该更新的值。这是一个大纲:

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

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

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

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

【问题讨论】:

  • 如果记忆有用,您确实会在同一事务中看到未提交的更改。自己检查和确认这一点应该不会太难
  • 谢谢,它有助于了解新技术而不是走上死胡同。我还需要一段时间才能有适当的机会进行测试,所以我想我应该问一下。
  • 如果你要走这条测试之路,你可能需要考虑隔离级别、驱动程序、特定数据库(本例中为 MySQL)。此外,您应该在测试中考虑INSERTDELETE

标签: mysql laravel transactions


【解决方案1】:

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

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

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) 中。

整个事务在提交之前按照模拟事件的顺序工作,因此它在“实际应用”更改之前“应用”更改。真的很难解释更多所以我希望这能回答我自己的问题。

【讨论】:

    猜你喜欢
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多