Транзакция базы данных CakePHP 2.3.x


Мне нужна ваша помощь в использовании транзакций в CakePHP.

У меня есть модель продукта с предложением hasMany для моделей цен и свойств (идентификатор ключевого продукта).

В моей модели продукта я добавляю

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

И в ProductController я использую save(), чтобы сохранить свой продукт, а затем свою цену и свойство. (Я использую только save(), а не saveAll()).

Мой код:

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

Проблема в том, что если у меня есть ошибка в строке сохранить цену или свойство, продукт все равно добавляется. Я я бы подумал, что, когда у меня будут какие-либо ошибки, ни одна из моих строк не будет добавлена (т. Е. Откат удалит ее).

Я использую CakePHP 2.3.8

Author: Warren Sergent, 2013-08-03

1 answers

Таблицы должны быть в формате InnoDB. Формат таблиц MyISAM не поддерживает транзакции.

Нет необходимости вставлять дополнительный код в модель.

Контроллер продукта:

$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();
}
 24
Author: Serge Rodovnichenko, 2016-03-29 08:09:45