mysqli 事务在插入失败时无法回滚
Mysqli transaction fail to rollback when insert is failed
我有 3 个数据库,我需要创建数据库 A,然后创建数据库 B,然后创建链接数据库 A_B。
我在 PHP 中使用 mysqli 事务,有一个奇怪的情况(这是我第一次使用 php 事务),它在失败时从不回滚,例如数据库 A 失败插入,但 B 仍然创建。并且 A_B 创建不正确。
mysqli_begin_transaction($link);
try{
$sql = "INSERT INTO A (
....)
VALUES
(?, ?, ?, ?, ?, ?, ?, ?, ?,?,?,?,?);";
$stmt = mysqli_prepare($link,$sql);
mysqli_stmt_bind_param($stmt,"sssssssssssss",
....
);
mysqli_stmt_execute($stmt);
$param_new_A_Rec = mysqli_insert_id($link);
for($i = 0; $i < $tot; $i++){
$sql = "INSERT INTO B (..)
VALUES
(?, ?, ?, ?, ?, ?, ?, ?, ?,?,?,?);";
$stmt = mysqli_prepare($link,$sql);
mysqli_stmt_bind_param($stmt,"ssssssssssss",
...
);
mysqli_stmt_execute($stmt);
$param_new_B_Rec = mysqli_insert_id($link);
$sql = "INSERT INTO A_B (
param_new_A_Rec,
param_new_B_Rec,
....
(?,?,?,?,?,?);";
$stmt = mysqli_prepare($link,$sql);
mysqli_stmt_bind_param($stmt,"ssssss",
....
);
mysqli_stmt_execute($stmt);
}
mysqli_commit($link);
}catch (mysqli_sql_exception $exception) {
mysqli_rollback($link);
throw $exception;
}
为什么如果 A 失败,它永远不会命中 rollback() 并且它创建了不正确的 A_B 和 B 数据?我在这里错过了什么吗?
任何帮助将不胜感激!
事实上,我需要添加这个
"mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);"
现在正在捕获无效用例:
PHP 致命错误:未捕获 mysqli_sql_exception:整数值不正确:yourFile.php
中第 1 行第 'boolean_X' 列的 ''
我有 3 个数据库,我需要创建数据库 A,然后创建数据库 B,然后创建链接数据库 A_B。
我在 PHP 中使用 mysqli 事务,有一个奇怪的情况(这是我第一次使用 php 事务),它在失败时从不回滚,例如数据库 A 失败插入,但 B 仍然创建。并且 A_B 创建不正确。
mysqli_begin_transaction($link);
try{
$sql = "INSERT INTO A (
....)
VALUES
(?, ?, ?, ?, ?, ?, ?, ?, ?,?,?,?,?);";
$stmt = mysqli_prepare($link,$sql);
mysqli_stmt_bind_param($stmt,"sssssssssssss",
....
);
mysqli_stmt_execute($stmt);
$param_new_A_Rec = mysqli_insert_id($link);
for($i = 0; $i < $tot; $i++){
$sql = "INSERT INTO B (..)
VALUES
(?, ?, ?, ?, ?, ?, ?, ?, ?,?,?,?);";
$stmt = mysqli_prepare($link,$sql);
mysqli_stmt_bind_param($stmt,"ssssssssssss",
...
);
mysqli_stmt_execute($stmt);
$param_new_B_Rec = mysqli_insert_id($link);
$sql = "INSERT INTO A_B (
param_new_A_Rec,
param_new_B_Rec,
....
(?,?,?,?,?,?);";
$stmt = mysqli_prepare($link,$sql);
mysqli_stmt_bind_param($stmt,"ssssss",
....
);
mysqli_stmt_execute($stmt);
}
mysqli_commit($link);
}catch (mysqli_sql_exception $exception) {
mysqli_rollback($link);
throw $exception;
}
为什么如果 A 失败,它永远不会命中 rollback() 并且它创建了不正确的 A_B 和 B 数据?我在这里错过了什么吗? 任何帮助将不胜感激!
事实上,我需要添加这个
"mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);"
现在正在捕获无效用例:
PHP 致命错误:未捕获 mysqli_sql_exception:整数值不正确:yourFile.php
中第 1 行第 'boolean_X' 列的 ''