在事务中尝试/捕获 - 与使用PHP或SQL有什么不同?
问题描述:
我很好奇哪个是在事务中使用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();
答
使用它在PHP代码,因此,如果您有多个查询和您的PHP代码失败,这些查询也会中止。
答
这两个选项的最终结果是相同的。执行数据库更改时可以在发生错误时进行回滚。这更多的是“我希望我的诚信保证达到什么水平”的问题。
代码开发人员将选择1;
数据库管理员会去选择2
IMO不过,因为它分开的意图的SQL逻辑执行我会去的选项之一。无论出于何种原因,您决定更改数据库技术选项1将允许它以最少的努力。 (如果您想要使用ORM,如Doctrine,Eloquent或甚至Active Record)。其中选项2需要查找/替换和测试所有可能的变体。
TL; DR:取决于你擅长什么;但是,尽可能抽象。“
希望这会有所帮助。
答
使用PDO API或MySQL Transaction在性能和影响方面是相等的,因为PDO只是SQL语句的抽象类。
I建议您阅读PDO documentation on transactions,这两种方式都是等价的,因为PDO将使用本机MySQL事务的驱动程序级事务。
你唯一要决定的是,如果你将执行一个混合的SQL语句与他们内部的PHP操作或只是一组纯粹的Mysql语句?
您的第一个示例使用由try catch包围的SQL事务。这对我来说是遵循的方式 – Mcsky
就我所知,一个简单的插入是原子的,不需要将其包含在事务中并将其回滚。如果失败,则失败。然而,总的想法是在PHP代码中进行。 SQL版本我只是用于准备好的语句。 – apokryfos
PHP版本看起来更漂亮:D –