【问题标题】:PHP MySQL Transaction catch errorPHP MySQL 事务捕获错误
【发布时间】: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 内回滚
  • 你能给我举个例子吗?我应该如何捕获每个查询的唯一错误消息?我是否必须在事务中分别检查每个查询,这可行吗?

标签: php mysql transactions commit rollback


【解决方案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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-28
    • 2016-08-07
    • 1970-01-01
    • 2016-11-25
    • 2018-03-29
    • 1970-01-01
    • 2019-11-25
    • 2018-06-04
    相关资源
    最近更新 更多