Транзакция базы данных 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
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();
}