0

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

我只使用mysql_而不是mysqli_PDO,因为在该服务器上它不受支持。

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发生。

PS我知道,使用 mysqli 应该会更好,但这对于mysql_mysqli_是一样的,不是吗?

4

2 回答 2

2

我建议阅读:http ://dev.mysql.com/doc/refman/5.0/en/commit.html ,特别是关于SET autocommit=0。我相信,如果您希望它不自动提交,则需要说出来,然后才不会自动调用COMMIT ROLLBACK您的语句。

最好有一个处理程序代码来执行对ROLLBACK的调用,否则您有信任 MySQL 为您完成所有工作的危险,并且您的代码可能无法正确处理与 TRANSACTIONS 相关的 MySQL 任何未来更改。

于 2013-07-01T10:52:46.403 回答
1

您确定数据保留在数据库中/在不执行提交查询的情况下提交吗?

MySQL 文档

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

开始交易;

SELECT @A:=SUM(salary) FROM table1 WHERE type=1;

UPDATE table2 SET summary=@A WHERE type=1;

犯罪;

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

我使用 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());
?>

值 foo1 和 foo2 未插入到数据库表 t10 中。还要记住,在“全有或全无”规则的意义上,MySQL 事务并不是完全原子的。您可以提交一个事务,其中一半语句已完成,另一半则失败(来源:Kouber Saparev 于 2010 年 12 月 3 日上午 11:01 在 MySQL 页面http://dev.mysql.com/doc/refman/5.5/en/ ansi-diff-transactions.html)。

测试用例:

mysql> create table t7 (id integer primary key auto_increment, name text, lastname text);
Query OK, 0 rows affected (0.04 sec)

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t7 (name, lastname) values('name1', 'lastname1');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t7 (name, lastname) values('name1', 'lastname1');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t7 (name, lastname) ('name1', 'lastname1');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near ''name
1', 'lastname1')' at line 1
mysql> commit;
Query OK, 0 rows affected (0.01 sec)

mysql> select * from t7;
+----+-------+-----------+
| id | name  | lastname  |
+----+-------+-----------+
|  1 | name1 | lastname1 |
|  2 | name1 | lastname1 |
+----+-------+-----------+
2 rows in set (0.00 sec)

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

于 2013-10-24T09:11:07.927 回答