İşlem geri alma çalışmıyor

4 Cevap php

(Evet, ben bir sargı etrafında sarıcı biliyorum, ama bazı ekstra işlevselliği ile sadece PDO olan) PDO sistemi etrafında ekstra işlevselliği ile bir veritabanı sarıcı yaptık. Ama bir sorun fark etmiş.

Olması gerektiği gibi Folowing çalışmıyor:

<?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());
?>

BeginTransaction ve rollBack fonksiyonları doğru dönmek var_dump gösterileri, böylece herhangi bir hata.

Ben ilk print_r çağrı N öğelerin bir dizi ve ikinci arama show N-1 öğeleri göstermek bekleniyor. Ama gerçek bu issn't, ikisi öğeleri aynı sayısını göstermektedir.

Benim $ db-> query (, ) başka bir şey aramak sonra $ pdo-> prepare () -> (ekstra hata tabii tutarken) () yürütmek.

Yani ben düşünüyorum ya da MySQL işlem sistemi çalışmıyor, ya da PDO'su implenmentaties çalışmıyor ya da ben yanlış bir şey görmek.

Herkes sorunun ne olduğunu biliyor mu?

4 Cevap

Veritabanı senin tipin innodb eşit olmadığını kontrol edin. Veritabanı işlemleri destekler ise tek kelimeyle kontrol etmelisiniz.

İki olası sorunlar:

  1. Tablo işlem desteklemiyor MyISAM. InnoDB kullanın.

  2. Emin oto-taahhüt olmak için kontrol edin KAPALI.

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

Yorum şu içeren küçük olduğu gibi, bir cevap olarak bu giriyorum:

PDO çeşitli alt düzey veritabanı arayüzü kütüphaneleri etrafında sadece bir sarıcı. Düşük seviyeli kütüphane şikayet etmezse, ya PDO olacaktır. MySQL işlemleri destekler yana, hiçbir işlem operasyonları bir sözdizimi hatası falan dönecektir. Sen işlemler içinde MyISAM tabloları kullanabilirsiniz, ama yine de aktif otomatik taahhüt sanki onlara yapılan herhangi bir işlem yapılacaktır:

mysql> create table myisamtable (x int) engine=myisam;
Query OK, 0 rows affected (0.00 sec)

mysql> create table innodbtable (x int) engine=innodb;
Query OK, 0 rows affected (0.00 sec)

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into myisamtable (x) values (1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into innodbtable (x) values (2);
Query OK, 1 row affected (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select * from myisamtable;
+------+
| x    |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql> select * from innodbtable;
Empty set (0.00 sec)

mysql>

Gördüğünüz gibi, bir işlem aktif olduğu ve bazı eylemler MyISAM tablo üzerinde gerçekleştirilen olsa bile, hiçbir hata atıldı.

MySQL maalesef varsayılan tablo türü MyISAM tablo türü, ilgili işlemleri desteklemiyor.

Eğer işlemleri gerekirse, InnoDB tablo türü geçmelisiniz.