2017-09-26 84 views
1

我很好奇哪個是在事務中使用Try/Catch的最佳實踐。哪一個更好,爲什麼?在事務中嘗試/捕獲 - 與使用PHP或SQL有什麼不同?

在做的try/catch只是在PHP代碼:

  $dbh->begintransaction(); 

      try { 
       $insert = "INSERT INTO test (id) VALUES(1)"; 
       $stpm = $dbh->prepare($insert); 
       $stpm->execute(); 

       $dbh->commit(); 

      } catch (\Exception $e) { 
       $dbh->rollback(); 
      } 
在SQL

或者直接:

$insert = "BEGIN TRANSACTION; 

BEGIN TRY 
    INSERT INTO test (id) VALUES(1) 
END TRY 
BEGIN CATCH 
    IF @@TRANCOUNT > 0 
     ROLLBACK TRANSACTION; 
END CATCH; 

IF @@TRANCOUNT > 0 
    COMMIT TRANSACTION;"; 

$stpm = $dbh->prepare($insert); 
$stpm->execute(); 
+0

您的第一個示例使用由try catch包圍的SQL事務。這對我來說是遵循的方式 – Mcsky

+0

就我所知,一個簡單的插入是原子的,不需要將其包含在事務中並將其回滾。如果失敗,則失敗。然而,總的想法是在PHP代碼中進行。 SQL版本我只是用於準備好的語句。 – apokryfos

+0

PHP版本看起來更漂亮:D –

回答

1

使用它在PHP代碼,因此,如果您有多個查詢和您的PHP代碼失敗,這些查詢也會中止。

2

這兩個選項的最終結果是相同的。執行數據庫更改時可以在發生錯誤時進行回滾。這更多的是「我希望我的誠信保證達到什麼水平」的問題。

代碼開發人員將選擇1;

數據庫管理員會去選擇2

IMO不過,因爲它分開的意圖的SQL邏輯執行我會去的選項之一。無論出於何種原因,您決定更改數據庫技術選項1將允許它以最少的努力。 (如果您想要使用ORM,如Doctrine,Eloquent或甚至Active Record)。其中選項2需要查找/替換和測試所有可能的變體。

TL; DR:取決於你擅長什麼;但是,儘可能抽象。「

希望這會有所幫助。

0

使用PDO API或MySQL Transaction在性能和影響方面是相等的,因爲PDO只是SQL語句的抽象類。

I建議您閱讀PDO documentation on transactions,這兩種方式都是等價的,因爲PDO將使用本機MySQL事務的驅動程序級事務。

你唯一要決定的是,如果你將執行一個混合的SQL語句與他們內部的PHP操作或只是一組純粹的Mysql語句?