2009-07-05 37 views
12

içinde geri alma işlemi gerçekleştirilemiyor Zend Framework'de işlem yapmak için aşağıdaki kodu kullanıyorum ancak geri alma işlevi çalışmıyor (Data, veri içine insertSome ($ data) ile eklenir). Sorun nedir? Bir upvote sahip en az bir cevap olmadığı süreceZend Framework

  $db->beginTransaction(); 
      try{ 
       $model->insertSome($data); 
       $model->insertAll($data2); //this line cannot be run and the whole transaction should be rolled back. 
       $db->commit(); 
      } catch (Exception $e) { 
       $db->rollBack(); 
       echo $e->getMessage(); 
      } 
+7

DB'niz MyISAM tablolarını kullanarak herhangi bir şans MySQL mi? İşlemleri desteklemiyorlar. İşlem desteği istiyorsanız, InnoDB tablolarını kullanmanız gerekir. – nos

+0

Evet, MyISAM tablolarını kullanıyorum. InnoDB tablolarına değiştirdim ve çalışıyor. Teşekkürler. – Billy

cevap

20

Biz StackOverflow'daki "cevaplanmamış" soruların listesinin dışına bu soruyu alınamıyor. Bu yüzden, yukarıda tartıştığınız çözümü yorumlarda tekrarlıyorum.

@nos öneriyor:

DB MyISAM tabloları kullanarak bir ihtimal MySQL tarafından mı? işlemlerini desteklemiyorlar. desteğini istiyorsanız, InnoDB tablolarını kullanmanız gerekir.

@Billy yanıt:

Evet, kullanıyorum Tablolar MyISAM. InnoDB tablolarına değiştim ve işe yarıyor. Teşekkürler.

benim masa InnoDB'nin olsaydı, (TABLO xxx CREATE GÖSTERİSİ görülen)

2

(Ben ondan hiç puan alamadım bu yüzden. Bir topluluk wiki cevap olarak bu işaretlediniz) ve benim işlem geri çekilmiyordu, ne önerirsiniz?

CREATE TABLE `EarningCode` (
`ID` int(11) NOT NULL auto_increment, 
`EarningCode` varchar(16) collate utf8_unicode_ci NOT NULL, 
`Description` varchar(255) collate utf8_unicode_ci NOT NULL, 
`DateEffective` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, 
`Rate` float NOT NULL, 
PRIMARY KEY (`ID`) 
) ENGINE=InnoDB AUTO_INCREMENT=1239 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

Bu birim test parçası: satır db eklenmez sağlamalıdır

protected function setUp() 
{ 
    global $db; 

    $db->beginTransaction(); 

    // Insert this tested object into db. 
} 

bir gözyaşı aşağı metodu (her biri: I Bir işlemi başlar kadar bir dizi yöntem olması Bu test sınıfında bir test çalıştırıldığında, setUp/tearDown çiftini çalıştırır ve böylece db tablomuzu dolduran kopyaları istemiyorum).

protected function tearDown() 
{ 
    global $db; 

    $db->rollBack(); 
} 

İdam ne SQL kontrol ettikten ve bunu autocommit işlem başlatıldığında false olarak ayarlanır ve geri alma sonra gerçek geçiş, ancak satır eklenir kalır görebilirsiniz.

0

Sizin kodunuz tamam.

Tablo seçeneğinizi kontrol edin. Transkctional motoru, InnoDb

2

ile birlikte kullanmanız gerekir. Gelecekte kullanmak için gerçekten bir DB İstisnası olup olmadığını öğrenmek için Zend_Db_Exception yerine kullanın.

} catch (Zend_Db_Exception $e) { 
    $db->rollBack(); 
    echo $e->getMessage(); 
} catch (Exception $e) { 
    echo $e->getMessage(); 
}