对不起,这是一个很笼统的问题,但我会尽量缩小范围。
我对MySQL/PHP中的所有事务都很陌生,但这看起来很简单。我只是使用mysql,而不是mysqli或PDO。我有一个脚本,它似乎正在回滚一些查询,但没有其他查询。这对我来说是未知的领域,所以我不知道发生了什么。
我用mysql_query('START TRANSACTION;')启动事务,我理解它同时禁用了自动提交。然后,我有很多复杂的代码,每当我进行查询时,它都是类似于这个mysql_query($sql) or $error = "Oh noes!"的。然后周期性地我有一个名为error_check()的函数,它检查$error是否是空的,如果不是空的,则检查mysql_query('ROLLBACK;')和die($error)。在后面的代码中,我有mysql_query('COMMIT;')。但是,如果我执行两个查询,然后故意抛出一个错误,我的意思是只设置$error = something,看起来第一个查询回滚,但第二个查询没有。
会有什么问题吗?我不知道的交易有什么问题吗?我不太清楚这些事务是如何开始和停止的,特别是当您将PHP混入其中时.
编辑:我的示例过于简化--实际上至少有两个事务在单独的表上进行插入、更新或删除。但是在执行每个语句之前,我会备份相应的“历史”表中的行,以允许撤消操作。看起来,主表的操作被回滚了,但是历史表中的条目仍然存在。
EDIT2: Doh!当我完成输入之前的编辑时,me...there上出现了一些问题,这些特定的tables...for肯定有问题,因为它们都被设置为MyISAM。
发布于 2010-08-26 07:32:48
请注意:确保所有表都使用事务支持引擎。假的。
发布于 2010-08-26 07:29:28
我建议使用米斯里或PDO函数而不是mysql,因为它们提供了一些值得改进的地方--特别是准备好的陈述的使用。
如果不看到您的代码,就很难确定问题所在。考虑到您说您的代码很复杂,问题很可能在于您的代码而不是MySQL事务。
您试过创建一些独立的测试脚本吗?也许您可以将SQL语句与应用程序隔离开来,并创建一个简单的脚本,只需串联运行它们。如果这有效的话,你已经缩小了问题的来源。您可以回显应用程序中的SQL语句,以获得运行顺序。
您还可以尝试测试来自MySQL客户端或通过PHPMyAdmin的相同序列的SQL语句。
您的历史表在同一个数据库中吗?
发布于 2010-08-26 07:39:48
Mysql事务只使用mysqli (而不是经典方法)。我一直在用交易。我所做的就是停用自动提交并运行我的SQL语句。
$mysqli->autocommit(FALSE);支持选择、插入、删除所有内容。只要我使用相同的mysqli句柄来调用这些语句,它们就在事务包装器中。只要事务仍然打开,外部任何人(不使用相同的mysqli句柄)都不会看到使用INSERT/DELETE编写/删除的任何数据。因此,关键是要确保每个SQL语句都使用该句柄触发。事务提交后,数据将提供给其他db连接。
$mysqli->commit();https://stackoverflow.com/questions/3572292
复制相似问题