Все транзакции выполняются с текущим объектом DataSource.
Во-первых, вам нужно получить его (в модели):
$dataSrc = $this->getDataSource();
Этот метод возвращает объект DataSource, который в данный момент привязан к модели.
Затем вы можете использовать методы объекта DataSource для запуска, фиксации или отката транзакции:
$dataSrc->begin();
//Do something
if (/*Everything is nice?*/) {
$dataSrc->commit();
} else {
//Bad things have happened
$dataSrc->rollback();
}
Конечно, вам придется реализовать свою собственную логику. Начиная с Cake 2.2, вы также можете выполнять настоящие вложенные транзакции. Согласно Википедии, "вложенная транзакция" это:
Вложенная транзакция возникает, когда новая транзакция запускается инструкцией, которая уже находится внутри существующей транзакции. Говорят, что новая транзакция вложена в существующую транзакцию, отсюда и термин. Вложенные транзакции реализуются по-разному в разных базах данных. Однако их объединяет то, что изменения не становятся видимыми для каких-либо несвязанных транзакций до тех пор, пока самая внешняя транзакция не будет зафиксирована. Это означает, что фиксация во внутренней транзакции не обязательно сохраняет обновления в базе данных.
Конечно, все это зависит от используемой вами базы данных. Механизм хранения транзакций MySQL InnoDB поддерживает транзакции.
И еще одно уточнение в ответ на этот комментарий:
Да, я использую $this->Model->saveAll($this->request->data, array('deep' => true) в своем контроллере. Это написано в цикле foreach. И только последняя запись foreach будет сохранен в базе данных», — Арун Джейн.
$this->Model->saveAll();
НЕ нужно запускать в цикле! Он будет управлять вещами для вас «автоматически». Уберите его из цикла. Кроме того, ваш вопрос касался транзакций, а не сохранения данных с помощью saveAll(). Model::saveAll() — это просто оболочка для saveMany() и saveAssociated() — он выберет, какой метод использовать, в зависимости от типа ассоциации модели.
Прочтите книгу о тортах, там все очень хорошо объяснено...
person
Borislav Sabev
schedule
04.07.2012