我想知道,因为当您执行一组查询时,事务非常有用。但是,如果我只执行一个查询,我是否应该使用它?
我目前有
$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();
如果效率不高,是否有另一种方法可以提高效率呢?
谢谢。
答案 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并且未明确启动事务时,您处于自动提交模式。这意味着每次启动查询时,都会启动一个事务,执行查询并立即提交事务(意味着标记为完成)。
在某些极少数情况下,考虑绩效和交易可能是合理的。例如。如果你操纵大量数据,那么在一次大型交易中执行所有语句的速度可能会更快(无论是否真的取决于你的数据库)。另一方面,在这种情况下,无论如何在事务中执行这些操作可能是合乎逻辑的,因为如果程序崩溃,则需要重新运行程序,它应该从头开始,而不是从最后一次离开的地方开始