PHP - 所有PDO事务和严格的MySQL事务之间的区别?

时间:2014-07-09 15:06:28

标签: php mysql sql pdo transactions

我在网上搜索了大约2天,试图找出使用所有PDO或所有MySQL进行交易的差异和可能的优缺点。

我每个成员大约需要20次插入,您可以同时注册多个成员,因此查询的数量可以轻松地从20到100+,我们对活动的估计范围可以从数百到数千个小时。

我知道交易,但我似乎并不了解的是,将所有插入批处理的PDO准备好或将它们全部分开之间有很大区别。 例如:

$stmt1 = $pdo->prepare($query1);
$stmt2 = $pdo->prepare($query2);
$stmt3 = $pdo->prepare($query3);
$stmt4 = $pdo->prepare($query4);
....

$pdo->beginTransaction();

try{
  foreach($members as $member)
  {
    $stmt1->execute($member);
    $stmt2->execute($member);
    $stmt3->execute($member);
    $stmt4->execute($member);
    ....
  }
  $pdo->commit();
catch(Exception $e)
{
  $pdo->rollback();
}

与某些事情相比:

//Inserts for ALL members
$sql = "
START TRANSACTION;
INSERT INTO...;
INSERT INTO...;
INSERT INTO...;
INSERT INTO...;
INSERT INTO...;
INSERT INTO...;
COMMIT;";

try{
  $pdo->prepare($sql);
  $stmt->execute($member);

catch(Exception $e)
{
  $pdo->query("ROLLBACK;");
}

这是否会造成开销,不得不一次发送一个查询,然后继续在PHP端进行解析,或者通过一次PDO调用一次性发送它是否有益?

更新

我注意到第二个例子中的混乱,我编辑了它。为清楚起见,问题是指潜在的"挂断"在使用多个PHP端查询(PDO一次执行一个SQL语句,仍然在一个事务中)的高容量流量中,与一个PDO执行时发送大块SQL(仍然只有一个事务)相比。

2 个答案:

答案 0 :(得分:3)

您使用PDO API还是本机(My)SQL语句有点无关紧要。性能上的差异将接近于零,因为PDO只是在一天结束时发出SQL语句的抽象类*。换句话说:

$pdo->beginTransaction();
$stmt1->execute($query1);
$stmt2->execute($query2);
$pdo->commit();

......与:

真的相同
$stmt1->execute('START TRANSACTION;' . $query1 . $query2 . 'COMMIT;');

您真正关心的是,在单个事务中创建每个成员还是在单个全局事务中创建所有成员是否更好。通常,在一次交易中插入所有内容会更快。

答案 1 :(得分:2)

当我阅读PDO documentation on transactions时,两种方法都是等价的。也就是说,PDO将使用驱动程序级别的事务功能,在pdo_mysql的情况下,应该启动本机MySQL事务。

我认为要考虑的更大问题正是您想要实现的目标。您是出于性能原因使用事务,还是因为数据是相关的,如果一个语句失败则不应插入任何内容?

如果是前者,我会建议对它进行基准测试。如果是后者,则需要构造代码,使逻辑相关的数据在同一事务中。


编辑以回复问题更新:

我倾向于说发布一个大的SQL语句会更快,因为网络流量开销应该会少一些(假设网络和数据库服务器不在同一台主机上)。好的'硬件和应用程序要求的正确配置MySQL应该能够每秒处理数千个插入。

当然,如果不知道您的设置细节,这是纯粹的推测。但我怀疑这种应用程序级优化远不如调优数据库服务器有效。

唯一可以确定的方法是对两种方式进行基准测试,看看是否有一种明显优于另一种方式。

相关问题