2013-08-03 41 views
5

Tôi cần bạn trợ giúp bằng cách sử dụng các giao dịch trong CakePHP.Giao dịch cơ sở dữ liệu CakePHP 2.3.x

Tôi có một Mô hình sản phẩm, với mệnh đề làMany to Price and Property models (key product_id).

Trong mô hình sản phẩm của tôi, tôi thêm

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); 
} 

Và trong ProductController tôi sử dụng tiết kiệm() để tiết kiệm sản phẩm của tôi, và sau đó giá và tài sản của tôi. (Tôi chỉ sử dụng save(), không saveAll()).

Mã của tôi là:

$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(); 
} 

Vấn đề là nếu tôi có một lỗi bên trong tiết kiệm Giá hoặc hàng tài sản, các sản phẩm vẫn đang gia tăng. Tôi đã nghĩ rằng khi tôi có bất kỳ lỗi nào, sẽ không có hàng nào của tôi được thêm vào (tức là một lần khôi phục sẽ xóa nó).

Tôi đang sử dụng CakePHP 2.3.8

Trả lời

22

Bàn phải ở định dạng InnoDB. Định dạng bảng MyISAM không hỗ trợ giao dịch.

Không cần chèn mã bổ sung vào mô hình.

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, nhưng, mysql hỗ trợ các bảng InnoDB và các giao dịch http://dev.mysql.com/doc/refman/5.0/en/commit.html –

+0

@MarceloAymone: Trong đó bối cảnh, anh ấy có nghĩa là ** MyISAM **. Và điều đó phải được gọi là '** engine **', không phải 'định dạng'! – Tuanitim

+0

Các giao dịch không được tự động sử dụng trong các bảng InnoDb? –

Các vấn đề liên quan