如果我只执行一个查询,那么使用事务的好处是否足够重要?

时间:2012-06-17 16:52:50

标签: php mysql transactions pdo

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

我目前有

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

如果效率不高,是否有另一种方法可以提高效率呢?

谢谢。

2 个答案:

答案 0 :(得分:3)

如果之后执行了任何对脚本正在执行的功能很重要的操作(假设是电子商务交易),那么保留查询就会出现问题(即与付款失败相关)然后您将要使用交易,即使只执行一个查询。否则,您将无需付款即可购买。

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

这是一个简单的例子:

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

当然,你会想要更好地处理这样的失败,但是这应该可以让你很好地证明交易是否合适。

答案 1 :(得分:2)

交易与效率无关

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

您不能没有交易

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

还在考虑表现吗?

在某些极少数情况下,考虑绩效和交易可能是合理的。例如。如果你操纵大量数据,那么在一次大型交易中执行所有语句的速度可能会更快(无论是否真的取决于你的数据库)。另一方面,在这种情况下,无论如何在事务中执行这些操作可能是合乎逻辑的,因为如果程序崩溃,则需要重新运行程序,它应该从头开始,而不是从最后一次离开的地方开始