我已經制作了一個數據庫包裝器,它帶有圍繞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個項目。但事實並非如此,它們都顯示相同數量的項目。
我的$ DB->查詢(< SQL>,<值>)調用沒有別的然後$ pdo->準備(< SQL>) - >執行(<值>)(額外的錯誤處理ofcourse)。
所以我認爲或MySQL的交易系統不起作用,或者PDO的實施不起作用或者我看到有什麼問題。
有誰知道問題是什麼?
這是解決方案。但奇怪的是,爲什麼pdo在MyISAM上使用事務時不會返回false(或拋出異常)......奇怪。 – VDVLeon 2010-02-17 15:18:04
您仍然可以與MyISAM進行交易 - 它無法回滾。這意味着交易是無效的。您甚至可以在同一個事務中混合使用事務性和非事務性表 - 這隻會讓人感到困惑。通常(在大多數情況下),你會希望所有的表都是innodb。 – MarkR 2010-02-17 22:02:54