Php 即使发生错误,MySQL事务也会提交

Php 即使发生错误,MySQL事务也会提交,php,mysql,transactions,Php,Mysql,Transactions,在我的项目中,我删除并更新了许多表中的许多行,所以我决定使用事务。但即使在发生错误且脚本即将结束时,事务也会提交 我只使用mysql\uu而不使用mysqli\u或PDO,因为在该服务器上它不受支持 mysql_query("START TRANSACTION"); $res = mysql_query("some insert..."); if($res === false){ //this save error log and exit script with die() or exit

在我的项目中,我删除并更新了许多表中的许多行,所以我决定使用事务。但即使在发生错误且脚本即将结束时,事务也会提交

我只使用mysql\uu而不使用mysqli\uPDO,因为在该服务器上它不受支持

mysql_query("START TRANSACTION");
$res = mysql_query("some insert...");
if($res === false){
  //this save error log and exit script with die() or exit()
  trigger_error(mysql_errno()."\n".mysql_error()); 
}
$res = mysql_query("some delete...");
if($res === false){
  trigger_error(mysql_errno()."\n".mysql_error()); 
}
mysql_query("COMMIT");
在我的项目中,我有一个mysql类,所以我不会这样键入,但它是这样工作的

当第一个查询错误发生后,保存错误日志并结束脚本。但插入的数据保留在数据库中。我想,当
COMMIT
未执行且连接关闭时,会自动发生
ROLLBACK

另外,我知道,使用mysqli应该会更好,但是对于mysql和mysqli也一样,不是吗?

我建议阅读:,特别是关于设置自动提交=0。我相信,如果你不想让它自动提交,你需要说出来,只有这样才能不调用COMMIT自动回滚您的声明

最好是使用一个处理程序代码来调用回滚,否则您可能会信任MySQL为您完成所有工作,并且将来对MySQL的任何与事务相关的更改都可能无法由您的代码正确处理。

我建议阅读:,特别是关于设置自动提交=0。我相信,如果你不想让它自动提交,你需要说出来,只有这样才能不调用COMMIT自动回滚您的声明


最好是使用一个处理程序代码来调用回滚,否则您可能会信任MySQL为您完成所有工作,并且将来对MySQL进行的与事务相关的任何更改都可能无法由您的代码正确处理。

您确定数据保留在数据库中/未执行任何操作就提交了吗提交查询

:

要对一系列语句隐式禁用自动提交模式,请使用START TRANSACTION语句:

启动交易

从表1中选择@A:=SUM(工资),其中type=1

更新表2 SET summary=@A,其中type=1

承诺

使用START TRANSACTION,自动提交将保持禁用状态,直到您使用提交或回滚结束事务。然后,自动提交模式将恢复到以前的状态

我使用MySQL 5.5和PHP 5.3测试了这段代码:

sql> create table t10 (id integer auto_increment primary key, status char(32))

<?php

  if( ($link = mysql_connect("localhost", "db_user", "*****")) === false )
    exit(1);

  mysql_select_db("test", $link);

  var_dump(mysql_query("start transaction;"));
  var_dump(mysql_query("insert into t10 (status) values (\"foo1\"), (\"foo2\");"));
  exit();
  //var_dump(mysql_query("commit;"));
  var_dump(mysql_close());
?>

我们发现,即使事务已成功提交,失败的插入查询也不算在内。

您确定数据保留在数据库中/未执行提交查询就提交了吗

:

要对一系列语句隐式禁用自动提交模式,请使用START TRANSACTION语句:

启动交易

从表1中选择@A:=SUM(工资),其中type=1

更新表2 SET summary=@A,其中type=1

承诺

使用START TRANSACTION,自动提交将保持禁用状态,直到您使用提交或回滚结束事务。然后,自动提交模式将恢复到以前的状态

我使用MySQL 5.5和PHP 5.3测试了这段代码:

sql> create table t10 (id integer auto_increment primary key, status char(32))

<?php

  if( ($link = mysql_connect("localhost", "db_user", "*****")) === false )
    exit(1);

  mysql_select_db("test", $link);

  var_dump(mysql_query("start transaction;"));
  var_dump(mysql_query("insert into t10 (status) values (\"foo1\"), (\"foo2\");"));
  exit();
  //var_dump(mysql_query("commit;"));
  var_dump(mysql_close());
?>

我们看到,即使事务已成功提交,失败的插入查询也不算在内。

您应该仅在成功提交后执行提交,并在出错后回滚我仅在成功提交后执行提交,但不在出错时回滚。我认为这是自动的。你应该只在成功后提交,在出错后回滚我只在成功后提交,但不在出错时回滚。我认为这是自动的。顺便说一句,在你发布的网站上写着,
START TRANSACTION
disable autocommit。我在错误函数中添加了回滚。但是仍然不明白为什么要保存数据,当没有执行提交和禁用自动提交时,
START TRANSACTION
disable autocommitdunno,对不起,需要“真正地调试它”,顺便说一句,在你发布的站点上,
START TRANSACTION
disable autocommit。我在错误函数中添加了回滚。但是仍然不明白为什么要保存数据,当没有执行提交并且
启动事务
禁用自动提交运行时,对不起,需要“真正调试它”