我与周围的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不工作或我看到了什么。
有谁知道问题是什么?
检查你的数据库的类型等于InnoDB的。在一个字,你必须检查,如果你的数据库支持事务。
我进入这个作为回答,作为一个评论是小到包含以下内容:
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表进行,没有错误被抛出。
MySQL不支持对MyISAM表类型,这是不幸的是,默认的表类型的交易。
如果你需要的交易,你应该切换到InnoDB表类型。
这可能发生的另一个原因是某些类型的SQL语句导致立即自动提交。我曾在那个渐渐立即提交并且忽略了交易的交易拥有巨大的脚本。我终于找到了,这是因为任何ALTER TABLE
声明立即引起承诺的情况发生。
导致自动提交报表的类型有:
ALTER TABLE
,CREATE TABLE
等ALTER USER
或SET PASSWORD
ANALYZE TABLE
,FLUSH
,或CACHE INDEX
更多信息和完整列表可以在这里找到:https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html
如果你有这个问题只与特定的脚本,你确定你使用的是InnoDB,你可能想看看如果在脚本中的任何SQL语句进行匹配。