如何在PHP ADODB中回滚事务

4

我正在尝试在php中使用ADODB(mysql驱动程序)的DB事务,但出于某些原因,我无法使事务正常工作。 目前,代码看起来有点像这样(为了使事情顺序化而简化)

// Start DB-connection
$db = NEWADOConnection('mysql');
$db->debug = false;
$db->disableBlobs = false;
$db->PConnect($host, $login, $password, $database); or die ("Connection failed");

// Start DB-transaction
$db->autoCommit = false; // According to doc, this should not be needed
$db->SetTransactionMode("SERIALIZABLE");
$db->StartTrans();

// Update some value
$statement = $db->Prepare("UPDATE tableName SET column=? WHERE id=$id");
$result = $db->Execute($statement, array($newValue));

// Do a rollback
$db->FailTrans(); // According to doc, indicates that CompleteTrans will rollback
$db->CompleteTrans();

// Close connection
$db->Close();

据我理解ADODB文档,代码应该是可以工作的,尽管由于某些原因,在运行此代码后表仍然被更新。
有人知道我忘记更改哪个配置吗?
提前感谢。
JVApen
一些背景信息:
PHP-version: PHP 5.3.10-1ubuntu3.9
ADODB-version: V5.18
Documentation I've based my code on: http://phplens.com/lens/adodb/docs-adodb.htm

在有人评论代码中的奇怪事情之前: 是的,我在查询中同时使用了预处理语句和字符串拼接, 尽管$id是我可以控制的内容,而$newValue是一些输入参数。


1
好奇:为什么你使用ADO DB而不是PDO / MySQLi? - Raptor
1
首先,这是一种习惯;其次,当我想要更改数据库时,至少会少一个问题。对于Maria-DB来说,这不是什么大问题,但如果我想使用Postgres,则可能会有用。 - JVApen
@JVApen,ADOdb是由一位作者编写的,最后一次发布已经有3年了。在使用ADOdb时要小心。 - Pacerier
@Pacerier:当我开始使用它时,我实际上也有同样的担忧,但是随着2014年4月发布的5.19版本和我记录的错误得到快速响应,我不再那么担心了。如果需要的话,我仍然可以切换到本地调用。 - JVApen
1个回答

4

找到问题了,问题似乎不在ADODB中(尽管它应该发出警告)。

使用MyISAM表而不是InnoDB表的MySQL可以确保不支持事务。如果您同时使用两者,则仅支持InnoDB表的事务。

将所有表转换为InnoDB后,问题似乎已经解决了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接