2017-09-26 41 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语句?