1

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

我目前有

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

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

谢谢你。

4

2 回答 2

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

自然地,您会希望更好地处理此类故障,但这应该可以很好地证明何时进行事务是合适的。

于 2012-06-17T16:56:49.943 回答
2

交易与效率无关

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

你不能没有交易

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

还在考虑性能?

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

于 2012-06-17T17:11:34.863 回答