我在使用php,pdo和mysql时遇到了一些奇怪的行为,当我尝试使用交易时,我确信它不应该是一个问题,但确实存在。
即使应该触发回滚,也会将更改写入数据库!
所以我得到了一个API的一部分,它正在对数据库中的数据进行更改。 由于某种原因,查询(query1和query2)返回0,这意味着没有编辑任何行。 这很奇怪,因为数据库中的数据已经改变,但那是另一个问题..
所以这是特定的段落。请注意,实际的PDO查询由函数包装,以实现可伸缩性和易用性,但它们可以正常工作,不用担心。
if ($this->db->transaction('begin') == FALSE)
{
$this->application->setStatus('508002', 'Database transaction failure');
return FALSE;
}
$count = 0;
$query1 = $this->db->genericUpdate('someData');
$query2 = $this->db->genericDelete('someData');
$count += $query1 + $query2;
if ($count < 1)
{
$this->db->RWQuery('ROLLBACK'); // Tried invoking the rollback manually...
$this->log('Count', $count); // Count is 0 in log file...
if ($this->db->transaction('rollback') == FALSE)
{
$this->application->setStatus('508002', 'Database transaction failure');
return FALSE;
}
}
由于一些奇怪的原因,MySQL服务器似乎忽略了发送到服务器的rollback命令。 我打开了my.cnf中的查询记录:
649 Query START TRANSACTION
649 Query UPDATE `tbl` SET bla = 'foo' WHERE blub = 'bar' LIMIT 1
649 Query DELETE FROM `tbl2` WHERE bla = 'fooo'
649 Query ROLLBACK
649 Query rollback
649 Quit
数据库引擎是InnoDB,我检查了两次或更多次。 此外,在Apache / PHP错误日志和任何其他syslog工具中都没有抛出异常。
此外,我不会发出任何可能触发提交的DDL语句。
我在网上的任何地方都找不到类似我的问题,如果有人遇到类似的问题,我很乐意听到。