【问题标题】:Rollback function is not working properly in PHP?回滚功能在 PHP 中无法正常工作?
【发布时间】:2019-01-29 15:50:53
【问题描述】:

我已经写了一个输入记录的代码,如果输入了第一条记录,则只能输入第二条,如果第二条失败,则第一条将回滚并且不会发生任何变化

<?php
include '../function.php';
// Set autocommit to off
mysqli_autocommit($mysqli,FALSE);
// Insert some values 
$a=mysqli_query($mysqli,"INSERT INTO test VALUES ('10','2')");
if($mysqli->affected_rows > 0)
{
    $b=mysqli_query($mysqli,"INSERT INTO test VALUES ('7','2')");
    if($mysqli->affected_rows > 0){
        mysqli_commit($mysqli);   
        echo "commited";
    }
    else{
        mysqli_rollback($mysqli);
        echo "rollback";
    }    
}else{
        echo "nothing";
}
// Close connection
mysqli_close($mysqli);

但是如果第二条记录保存失败,上面的代码会回滚我的第一条记录。

【问题讨论】:

  • 如果您希望它们成为单独的事务,您需要在添加第二个之前提交第一个;否则整个事务将回滚(即两条记录)。

标签: php mysqli transactions rollback


【解决方案1】:

建议您使用 begin_transaction 并尝试使用 catch 功能。下面是例子:

    $link = mysqli_connect("127.0.0.1", "my_user", "my_password", "sakila");

if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}
try {
    mysqli_begin_transaction($link, MYSQLI_TRANS_START_READ_WRITE);

    mysqli_query($link, "Insert statement 1");
    mysqli_query($link, "Insert statement 2");
    mysqli_commit($link);
    } catch (Exception $e) {
        mysqli_rollback();
    }

【讨论】:

  • 查询没有正确完成不会报错,所以commit一直在运行
猜你喜欢
  • 2011-04-19
  • 2017-09-23
  • 2013-04-08
  • 1970-01-01
  • 2013-11-06
  • 2013-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多