2012-07-03 3 views
0

Я использую базу данных innoDB. Как я могу использовать транзакцию для сохранения данных.Использование транзакций в CakePHP 2.1.3

У меня есть множество пользователей. Но сохраняет только последнюю запись в базе данных. Я не могу использовать saveAll, потому что мне нужно сохранять данные в нескольких таблицах, и все они взаимосвязаны.

Я даже не могу определить модель ассоциации, потому что в моей базе данных имеется огромное количество записей. Поэтому каждый раз соединение будет выполняться.

Пожалуйста, предложите, как я могу использовать концепцию транзакции?

ответ

3

Все транзакции выполняются на текущем объекте DataSource.

Во-первых, вам нужно, чтобы получить его (в модели):

$dataSrc = $this->getDataSource(); 

This method возвращает объект DataSource, который в настоящее время привязан к модели.

Затем вы можете использовать DataSource Object's methods начать, зафиксировать или откатить transactions:

$dataSrc->begin(); 
//Do something 

if (/*Everything is nice?*/) { 
    $dataSrc->commit(); 
} else { 
    //Bad things have happened 
    $dataSrc->rollback(); 
} 

Вы должны реализовать свою собственную логику, конечно. С Cake 2.2 you can also do real nested transactions. А «вложенные транзакции» в соответствии с Wikipedia является:

A nested transaction occurs when a new transaction is started by an instruction that is already inside an existing transaction. The new transaction is said to be nested within the existing transaction, hence the term. Nested transactions are implemented differently in different databases. However, they have in common that the changes are not made visible to any unrelated transactions until the outermost transaction has committed. This means that a commit in an inner transaction does not necessary persist updates to the database.

Конечно, все это зависит от базы данных, которую вы используете. MySQL InnoDB transactional storage engine. Поддержка сделка.

И еще одно уточнение в ответ на этот комментарий:

Yes, I am using $this->Model->saveAll($this->request->data, array('deep' => true) in my controller. This is written under a foreach loop. And only the last foreach record is going to be saved into the database. – Arun Jain

$this->Model->saveAll(); не нужно запускать в цикле! Он будет управлять вещами для вас «автоматически». Выньте его из петли. Кроме того, ваш вопрос касался транзакций, а не сохранения данных с помощью saveAll(). Model::saveAll() - это просто обертка для saveMany() и saveAssociated() - он выберет, какой метод использовать в зависимости от типа ассоциации модели.

Читать Cake Book все это очень хорошо объяснено там ...

+0

, когда я пытаюсь использовать $ DATASRC = $ this-> GetDataSource(); это дает мне ошибку: использование неопределенного метода. –

+1

Вы пытаетесь сделать это где-нибудь еще, а не в ** Модели **? Нет другого случая, чтобы вы могли получить _use неопределенной ошибки метода. –

+0

Да, я использую $ this-> Model-> saveAll ($ this-> request-> data, array ('deep' => true) в моем контроллере. Это написано под циклом foreach. И только последний foreach запись будет сохранена в базе данных. –

Смежные вопросы