PHP MySQL 事务捕获错误

Posted

技术标签:

【中文标题】PHP MySQL 事务捕获错误【英文标题】:PHP MySQL Transaction catch error 【发布时间】:2017-08-27 12:16:57 【问题描述】:

我已经找了两天了,仍然没有找到答案。假设我在 php 中有下面的代码:

$mysqli->begin_transaction();
mysqli_query($mysqli, "DELETE FROM Test WHERE ID=1");
mysqli_query($mysqli, "DELETE FROM TEST WHEREE ID=2"); <-- THIS ONE WILL FAIL BECAUSE OF TYPO
mysqli_query($mysqli, "DELETE FROM Test WHERE ID=3");
if ($mysqli->commit()) 
    //SUCCESS
    
else 
    //Failed        
    $mysqli->rollback();
    

我无法检查事务中的查询是否全部成功,因为当我执行这些查询时,提交函数总是返回 true。

如何检查事务中的所有查询是否成功?

【问题讨论】:

将提交包含在 try / catch 结构中。 并在 catch 内回滚 你能给我举个例子吗?我应该如何捕获每个查询的唯一错误消息?我是否必须在事务中分别检查每个查询,这可行吗? 【参考方案1】:

执行此操作的常用方法:

$mysqli->begin_transaction();
try 
    mysqli_query($mysqli, "DELETE FROM Test WHERE ID=1");
    mysqli_query($mysqli, "DELETE FROM TEST WHEREE ID=2"); <-- THIS ONE WILL FAIL BECAUSE OF TYPO
    mysqli_query($mysqli, "DELETE FROM Test WHERE ID=3");
    $mysqli->commit();
 catch (\Exception $e) 
    // this will show statement with error
    echo $e->getMessage();
    $mysqli->rollback();
    throw $e;

【讨论】:

我已经尝试过了,但是由于它不会捕获异常,所以它会提交? 这没有意义。 $mysqli-&gt;commit(); 应该立即之前 catch 这样如果任何失败,无论是查询还是提交,我们都会拼命尝试回滚。 是的,你是对的,通常在提交时可能会出现错误,但这是并发查询中非常具体的错误,而不是语法无效的情况【参考方案2】:

您可以使用 mysqli_error 来捕获错误。

$startTrans = 'START TRANSACTION;';  // Starting a mysql transaction
mysqli_query($conn, $startTrans); 

$query = 'Insert into students (roll_no,name,class) VALUES (101,"mathew","fourth")';
$result = mysqli_query($conn, $query);
if (mysqli_error($conn)) 
   // Rollback can be done here 
   mysqli_query($conn, "ROLLBACK;"); // All above queries will get rolled back
   die(mysqli_error($conn)); 
 else 
   mysqli_query($conn, "COMMIT;"); // changes will get saved to database

【讨论】:

以上是关于PHP MySQL 事务捕获错误的主要内容,如果未能解决你的问题,请参考以下文章

Postgresql 捕获事务错误和回滚

mysql存储过程事务和捕获异常信息

未捕获的错误:调用未定义的函数 mysql_escape_string()

如何在 NestJs 中捕获 Typeorm 事务错误

PHP 致命错误:未捕获的错误:调用字符串中的成员函数 diff()

PHP PDOException没有捕获