2013-08-03 11 views
5

Potrzebuję twojej pomocy przy użyciu transakcji w CakePHP.Transakcja bazy danych CakePHP 2.3.x

Mam model produktu, z klauzulą ​​ma wiele do ceny i modeli nieruchomości (klucz product_id).

W moim modelu Produktu, dodaję

function begin() { 
    $db =& ConnectionManager::getDataSource($this->useDbConfig); 
    $db->begin($this); 
} 

function commit() { 
    $db =& ConnectionManager::getDataSource($this->useDbConfig); 
    $db->commit($this); 
} 
function rollback() 
{ 
    $db =& ConnectionManager::getDataSource($this->useDbConfig); 
    $db->rollback($this); 
} 

I ProductController używam save(), aby zapisać moje urządzenie, a następnie mój cenę i mienia. (Używam tylko save(), nie saveAll()).

Mój kod to:

$this->Product->begin(); 
$error = false; 
if($this->Product->save($data) 
{ 
    //my functions and calculations 
    if(!$this->Price->save($data_one) 
    { 
     $error = true; 
    } 
    //calculations 
    if(!$this>Property->save($my_data) 
    { 
     $error = true; 
    } 
} 
if($error) { 
    $this->Product->rollback(); 
} 
else 
{ 
    $this->Product->commit(); 
} 

Problem polega na tym, że jeśli mam błąd wewnątrz Cena oszczędzania lub wiersza obiektu, produkt jest dodawany. Pomyślałbym, że gdy wystąpią jakiekolwiek błędy, żaden z moich wierszy nie zostanie dodany (tzn. Wycofanie go spowoduje usunięcie go).

Używam CakePHP 2.3.8

Odpowiedz

22

Tabele musi być w formacie InnoDB. Format tabel MyISAM nie obsługuje transakcji.

Nie trzeba wstawiać dodatkowego kodu do modelu.

ProductController:

$datasource = $this->Product->getDataSource(); 
try { 
    $datasource->begin(); 
    if(!$this->Product->save($data) 
     throw new Exception(); 

    if(!$this->Price->save($data_one) 
     throw new Exception(); 

    if(!$this->Property->save($my_data) 
     throw new Exception(); 

    $datasource->commit(); 
} catch(Exception $e) { 
    $datasource->rollback(); 
} 
+0

hi, ale mysql obsługuje tabele InnoDB i transakcje http://dev.mysql.com/doc/refman/5.0/en/commit.html –

+0

@MarceloAymone: W tym w kontekście, oznacza ** MyISAM **. A to musi być nazywane "** engine **", a nie "format"! – Tuanitim

+0

Czy transakcje nie są automatycznie używane w tabelach InnoDb? –