【问题标题】:Is the benefit significant enough to use transaction if I'm only performing one query?如果我只执行一个查询,那么使用事务的好处是否足够显着?
【发布时间】:2023-03-22 03:51:01
【问题描述】:

我想知道,因为事务在您执行一组查询时很有用。但是,如果我只执行一个查询,我应该费心使用它吗?

我现在有

$res = $pdo->query("SELECT id FROM products LIMIT 5");
$row = $res->fetchAll();

它所做的就是这样。下面的代码效率更高吗? (我认为它不是因为它只做一件事,但我不确定)

$pdo->beginTransaction();
$res = $pdo->exec("SELECT id FROM products LIMIT 5");
$pdo->commit();

如果不是更有效,是否有其他更有效的替代方法?

谢谢。

【问题讨论】:

  • 事务在您写入数据库(INSERT、UPDATE 和 DELETE)时最重要
  • 如果您想运行多个SELECT 语句并确保它们在数据库修改序列中看到来自同一点的数据,那么事务也是绝对关键的。如果您使用REPEATABLE READSERIALIZABLE 事务,您可以确保不同 事务中INSERTUPDATEDELETE 的影响不会消失一个SELECT 的结果,但出现在下一个中。

标签: php mysql transactions pdo


【解决方案1】:

如果在查询之后 执行了对脚本正在执行的功能很重要的任何操作(比如说电子商务交易),那么将查询留在原处将是有问题的(例如与付款失败相关),那么即使只执行一个查询,您也会想要使用交易。否则你会在没有付款的情况下购买。

如果该事务是该脚本中唯一发生的事情,则事务是不必要的,可以/应该避免。

这是一个简单的例子:

try 
{
    $pdo->beginTransaction();
    $res = $pdo->exec("INSERT INTO orders ....");
    // Try to make payment
    $payment->process();
    $pdo->commit();
}
catch (Exception $e)
{
    // Payment failed unexpectedly! Rollback the transaction.
    $pdo->rollback();
}

当然,您会希望更好地处理此类故障,但这应该可以让您很好地展示何时适合进行事务处理。

【讨论】:

    【解决方案2】:

    交易与效率无关

    事务允许您将多个语句组合成一个原子语句,这意味着它会完全完成或根本不完成,但不能部分完成。例如。如果您从一个银行帐户中取出钱,然后将其添加到另一个银行帐户,那么此操作应该完全发生(帐户 a 少 x 美元,帐户 b 多 x 美元)或根本不发生。绝对不能发生的是,您从账户 a 中取出资金,然后系统崩溃,资金在数字虚空中丢失。

    你不能没有交易

    当您使用 PDO 并且没有显式启动事务时,您将处于自动提交模式。这意味着每次启动查询时,都会启动事务,执行查询并立即提交事务(意味着标记为完成)。

    还在考虑性能吗?

    在极少数情况下,考虑性能和交易可能是合理的。例如。如果您正在处理大量数据,则可以更快地(是否真的取决于您的数据库)在一个大型事务中执行所有语句。另一方面,在这种情况下,无论如何在事务中进行这些操作可能是合乎逻辑的,因为如果您的程序崩溃,您想重新运行程序,它应该从头开始,而不是上次离开的地方.

    【讨论】:

      猜你喜欢
      • 2014-12-26
      • 2011-02-19
      • 2012-03-03
      • 2013-11-11
      • 1970-01-01
      • 2020-08-06
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      相关资源
      最近更新 更多