【发布时间】:2014-08-30 16:36:12
【问题描述】:
我已经在网上搜索了大约 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 执行(仍然只有一个事务)。
【问题讨论】:
-
在您的第一个 sn-p 中,
$pdo->beginTransaction()或$pdo->commit();放错了位置。它们应该都在循环内部或都在循环之外。我想你的问题是他们什么时候在循环之外?如果两者都在里面,那么你的两个方法是严格等价的。 -
你说得对,我匆匆完成了这个例子。无论如何,这不是直接代码。我对这两种可能的方法之间的差异更感兴趣。
标签: php mysql sql pdo transactions