事务回滚不起作用

问题描述 投票:5回答:5

我与周围的PDO系统额外的功能数据库包装(是的,我知道周围的包装的包装,但它仅仅是PDO与一些额外的功能)。但是,我也注意到这样一个问题。

如下因素不起作用像它应该是:

<?php
var_dump($db->beginTransaction());

$db->query('
 INSERT INTO test
 (data) VALUES (?)
 ;',
 array(
  'Foo'
 )
);
print_r($db->query('
 SELECT *
 FROM test
 ;'
)->fetchAll());

var_dump($db->rollBack());

print_r($db->query('
 SELECT *
 FROM test
 ;'
)->fetchAll());
?>

后续代码var_dump的表明的BeginTransaction和回滚功能返回true,所以没有错误。

我期望的是,第一的print_r呼叫显示的N个项目一个阵列和所述第二呼叫显示N-1的项目。但是,issn't真的,他们都表现出相同数量的项目。

我的$ DB->查询(<SQL>,<值>)调用没有别的然后$ pdo->准备(<SQL>) - >执行(<值>)(额外的错误处理ofcourse)。

所以,我认为或MySQL的交易系统不能正常工作,或PDO的implenmentaties不工作或我看到了什么。

有谁知道问题是什么?

php mysql pdo transactions
5个回答
14
投票

检查你的数据库的类型等于InnoDB的。在一个字,你必须检查,如果你的数据库支持事务。


4
投票

两种可能出现的问题:

  1. 该表的MyISAM不支持事务。使用InnoDB。
  2. 检查以确保自动提交关闭。

http://www.php.net/manual/en/pdo.transactions.php


3
投票

我进入这个作为回答,作为一个评论是小到包含以下内容:

PDO只是周围的各种低级别的数据库接口库的包装。如果低级别的库不抱怨,要么将PDO。由于MySQL支持的交易,没有交易操作将返回一个语法错误或什么的。您可以使用事务中的MyISAM表,但他们所做的任何操作都将完成,就好像自动提交仍然活跃:

mysql> create table myisamtable (x int) engine=myisam;
Query OK, 0 rows affected (0.00 sec)

mysql> create table innodbtable (x int) engine=innodb;
Query OK, 0 rows affected (0.00 sec)

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

mysql> insert into myisamtable (x) values (1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into innodbtable (x) values (2);
Query OK, 1 row affected (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select * from myisamtable;
+------+
| x    |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql> select * from innodbtable;
Empty set (0.00 sec)

mysql>

正如你所看到的,即使交易活跃,以及一些行动是对MyISAM表进行,没有错误被抛出。


2
投票

MySQL不支持对MyISAM表类型,这是不幸的是,默认的表类型的交易。

如果你需要的交易,你应该切换到InnoDB表类型。


0
投票

这可能发生的另一个原因是某些类型的SQL语句导致立即自动提交。我曾在那个渐渐立即提交并且忽略了交易的交易拥有巨大的脚本。我终于找到了,这是因为任何ALTER TABLE声明立即引起承诺的情况发生。

导致自动提交报表的类型有:

  • 任何修改表或数据库中,如ALTER TABLECREATE TABLE
  • 任何修改表权限,如ALTER USERSET PASSWORD
  • 凡是锁定该表,或者开始一个新的事务
  • 数据加载报表
  • 行政语句,如ANALYZE TABLEFLUSH,或CACHE INDEX
  • 复制控制语句,如任何与奴隶或主

更多信息和完整列表可以在这里找到:https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html

如果你有这个问题只与特定的脚本,你确定你使用的是InnoDB,你可能想看看如果在脚本中的任何SQL语句进行匹配。


推荐问答