如果我只执行一个查询,好处是否足以使用事务


Is the benefit significant enough to use transaction if I'm only performing one query?

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

我目前有

$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();

如果它不是更有效率,是否有另一种可能更有效的方法?

谢谢。

如果在查询执行的任何操作对脚本正在执行的功能很重要(假设电子商务交易),并且保留查询会有问题(即与付款失败相关的内容),那么即使只执行一个查询,您也会想要使用事务。否则,您无需付款即可购买。

如果该事务是

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

下面是一个简单的示例:

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();
}

当然,你会希望更好地处理这样的故障,但这应该可以让你很好地展示何时交易是合适的。

交易与效率无关

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

您不能没有交易

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

还在考虑性能吗?

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