2014-07-09 198 views
0

我一直在網上搜索了大約2天,試圖找出使用所有PDO或所有MySQL進行交易的差異和可能的優勢/劣勢。PHP - 所有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呼叫一次全部發送?

UPDATE

我注意到在第二個例子中的困惑,我已經editted它。爲了清楚起見,問題在於使用多個PHP端查詢(PDO一次執行一條SQL語句,仍然在一個事務中),在大量流量中潛在的「掛斷」,而發送一大塊SQL一個PDO執行(仍然只有一個事務)。

+0

在你的第一個代碼片段中,'$ pdo-> beginTransaction()'或者'$ pdo-> commit();'是錯位的。他們應該既在內部又在外部。我想你的問題是他們在循環之外?如果兩者都在裏面,那麼你的兩個承認是完全等同的。 – RandomSeed

+0

你是對的,我衝過了這個例子。無論如何,這不是直接的代碼。我對兩種可能的方法之間的差異更感興趣。 – Jish

回答

2

當我閱讀PDO documentation on transactions時,兩種方法都是等價的。也就是說,PDO將使用驅動程序級別的事務功能,對於pdo_mysql,應該是開始本地MySQL事務。

我認爲要考慮的更大的問題正是你想要實現的。您是出於性能原因使用事務,還是因爲數據是相關的,並且如果一條語句失敗,應該插入任何內容?

如果是前者,我會建議對它進行基準測試。如果後者需要構建代碼,以使邏輯相關的數據在同一事務中。響應


編輯質疑更新:

我傾向於說,發出一個大的SQL語句會更快,因爲那裏應該少一點的網絡流量開銷(假設Web和數據庫服務器不在同一主機上)。使用「好」的硬件和正確的配置爲您的應用程序要求MySQL應該能夠處理數千次插入。

當然,不知道你的設置的細節,這是純粹的猜測。但我懷疑這種應用程序級別的優化比調整數據庫服務器的效率差得多。

唯一可以肯定的方法是對兩種方式進行基準測試,看看其中一個是否明顯優於另一個。

+0

我正在使用交易的完整性,而如果一個失敗應該被添加。感謝您的洞察力。 – Jish

+0

在第二個例子中,我意識到了一些輕微的混淆,插入語句將包括所有成員,最後一個提交。 – Jish

+0

感謝您對更新的回覆,非常感謝。我發現了一個類似的問題(http://stackoverflow.com/questions/10863598/mysql-php-pdo-prepared-statements-performance-issues-vs-security),響應與您的相同; 「過早優化」。 – Jish

2

無論您使用PDO API還是本機(My)SQL語句都有點不相關。性能差異將接近零,因爲PDO只是在一天結束時發佈SQL語句的抽象類。換句話說:

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

...真的一樣:

$stmt1->execute('START TRANSACTION;' . $query1 . $query2 . 'COMMIT;'); 

您的實際關注的是,它是否是最好創建一個單獨的事務中每個成員,或者在一個單一的所有成員全球交易。大多數情況下,在一個事務中插入所有內容會更快。

+0

我想我明白你在說什麼。這更像是我的一位同事的不安全感。如果使用beginTransaction()基本上與另一個相同,那麼這就回答了我的問題。如果PDO對象發送請求,返回,發送另一個請求等等,那麼問題就更多了。因爲您正在每個查詢中從應用程序到數據庫進行通信。 – Jish

+0

我在第二個例子中意識到了一些輕微的混淆,插入語句將包括所有成員,並在最後提交一個提交。 – Jish