事务回滚不起作用

VDV*_*eon 5 php mysql pdo transactions

我已经在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());
?>
Run Code Online (Sandbox Code Playgroud)

var_dump显示beginTransaction和rollBack函数返回true,因此没有错误.

我希望第一个print_r调用显示N个项目的数组,第二个调用显示N-1个项目.但事实并非如此,它们都显示相同数量的项目.

我的$ db->查询(<sql>,<values>)只调用$ pdo-> prepare(<sql>) - > execute(<values>)(带有额外的错误处理).

所以我认为或MySQL的交易系统不起作用,或PDO的实现不起作用或我看错了.

有谁知道问题是什么?

one*_*eat 14

检查您的数据库类型是否等于innoDB.总之,您必须检查数据库是否支持事务.


Yad*_*ada 5

两个可能的问题:

  1. 该表是MyISAM,不支持事务。使用InnoDB。

  2. 检查以确保自动提交已关闭。

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