2010-07-26 19 views
6

Sorunun kendisinin oldukça açıklayıcı olduğunu düşünüyorum. Kod aşağıda verilmiştir - Ben catch bloğunun içinde hareketi geri am bileAşağıdaki PDO işlemi neden çalışıyor?

<?php 
    $PDO = NULL; 
    $pdo_dsn = 'mysql:host=localhost;dbname=pdo_test'; 
    $pdo_persistence = array(PDO::ATTR_PERSISTENT => true); 
    $db_user = 'root'; 
    $db_pass = ''; 
    $db_query = "INSERT INTO person(name, address) 
        VALUES ('Mamsi Mamsi', 'Katabon')"; 

    try 
    { 
      $PDO = new PDO($pdo_dsn, $db_user, $db_pass, 
           $pdo_persistence); 
    } 
    catch(PDOException $e) 
    { 
      echo "Error occured: ". $e->getMessage(); 
      die(); 
    } 

    $PDO->setAttribute(PDO::ATTR_ERRMODE, 
          PDO::ERRMODE_EXCEPTION); 
    $PDO->setAttribute(PDO::ATTR_AUTOCOMMIT, false); 

    try 
    { 
      $PDO->beginTransaction(); 
      $PDO->exec($db_query); 

      throw new PDOException('Generated Exception'); 

      $PDO->commit(); 
    } 
    catch(PDOException $e) 
    { 
      echo "An error occured while doing a database transaction. The 
      error message is : ".$e->getMessage(); 

      $PDO->rollBack(); 
      die(); 
    } 
?> 

, veriler hala veritabanına eklenen ediliyor. Niye ya?

ben fazla açıklama için documentation aşağıdaki birkaç satır ekliyorum

DÜZENLEME - PDO olarak bilinen çalışmasına ihtiyacı Maalesef

, her veritabanı işlemleri destekler bağlantısını ilk açtığınızda "otomatik taahhüt" modu. Otomatik tamamlama modu veritabanı destekliyorsa, ya da hiç işlem veritabanı işlemleri desteklemiyorsa çalıştırmak her sorgu, kendi örtük işlem olduğu anlamına gelir. işlemine gereksiniminiz varsa, kodunu başlatmak için PDO :: beginTransaction() yöntemini kullanmanız gerekir. Temel sürücü işlemleri desteklemiyorsa, bir PDOException ( ayarlarının hata ayıklama işleminden bağımsız olarak) atılacaktır: bu her zaman ciddi bir hata durumudur). Eğer bir işlem olup kez işlem sırasında çalışacak kodun başarı durumuna bağlı olarak bitirmek için PDO :: işlemek kullanabilir() veya PDO :: rollBack(). this sayfadan Ayrıca

, aşağıdaki satırları -

bool PDO::beginTransaction (void ) 

autocommit modunu kapatır. autocommit modu kapalıyken PDO nesne örneği üzerinden veritabanına yapılan değişiklikler PDO arayarak işlemi sona kadar işlememiş vardır :: taahhüt(). PDO :: rollBack() yönteminin çağrılması, tüm değişiklikleri veritabanına geri alır ve bağlantıyı otomatik kabul moduna döndürür. Bir veritabanı tanımlama dili (DDL) deyimi gibi DROP TABLE veya CREATE TABLE bir hareket içinde kesilirken MySQL dahil

bazı veritabanları, otomatik olarak bir örtülü COMMIT yayınlanabilecek. örtülü COMMIT, işlem sınırı içinde diğer tüm değişiklikleri geri almanızı önleyecektir.

+0

Şu anda bir istisna attığınız işlemi geri alırsanız ne olur? – Amber

+0

@Amber: bu bir :( –

cevap

15

Size veritabanı türü olarak innodb kullandığınızı kontrol etmelidir. MyISAM işlemleri desteklemiyor.

+0

"sorunu" Bunları desteklemeyen bir sürücü kullanarak bir hareketi başlatmak PDO istisna yükseltmek gerekiyordu olmasıdır test etmedi Bug Kötü dokümanlar – cbednarski

+0

ipucu yok.?. Tek bildiğim, MySQL Sürücüsü ile PDO kullanarak işlemler yapmaya çalıştığım zaman bunun benim için bir sorun olduğudur, hiçbir istisna atılmadı.Bir hata olabilir, emin olmak için dokümanlar okumalıydım. bir hata değildir görüntülenir: başarısızlık başarı veya YANLIŞ durumunda döner Ben başvurulan PDO-> beginTransaction –

+0

Dokümanlar için adam sayfalarından edilir burada. http://us2.php.net/manual/en/pdo.transactions .php – cbednarski

İlgili konular