Транзакции в codeigniter с несколькими таблицами - PullRequest
0 голосов
/ 20 апреля 2010

Я новичок в транзакциях в целом, но особенно с CodeIgniter. Я использую InnoDB и все такое, но мои транзакции не откатываются, когда я этого хочу. Вот мой код (немного упрощенный).

            $dog_db = $this->load->database('dog', true);
            $dog_db->trans_begin();

            $dog_id = $this->dogs->insert($new_dog); //Gets primary key of insert
            if(!$dog_id)
            {
                $dog_db->trans_rollback();
                throw new Exception('We have had an error trying to add this dog.  Please go back and try again.');
            }

            $new_review['dog_id'] = $dog_id;
            $new_review['user_id'] = $user_id;
            $new_review['date_added'] = time();

            if(!$this->reviews->insert($new_review)) //If the insert fails
            {
                $dog_db->trans_rollback();
                throw new Exception('We have had an error trying to add this dog.  Please go back and try again.');
            }

                //ADD DESCRIPTION
            $new_description['description'] = $add_dog['description'];
            $new_description['dog_id'] = $dog_id;
            $new_description['user_id'] = $user_id;
            $new_description['date_added'] = time();

            if(!$this->descriptions->insert($new_description))
            {
                $dog_db->trans_rollback();
                throw new Exception('We have had an error trying to add this dog.  Please go back and try again.');
            }

                $dog_db->trans_rollback();  //THIS IS JUST TO SEE IF IT WORKS
                throw new Exception('We have had an error trying to add this dog.  Please go back and try again.');

            $dog_db->trans_commit();
}

catch(Exception $e)
{
    echo $e->getMessage();
}

Я не получаю никаких сообщений об ошибках, но и не откатывается. Он должен откатиться в этом последнем trans_rollback прямо перед фиксацией. Все мои модели находятся в базе данных "dog", поэтому я думаю, что транзакция будет выполнять функции моделей. Может быть, вы просто не можете использовать такие модели. Любая помощь будет принята с благодарностью! Спасибо!

Ответы [ 2 ]

2 голосов
/ 30 апреля 2012

Ну, я знаю, что этот пост античный, но вот мои 2 цента:

Я так не думаю:

if(!$this->descriptions->insert($new_description))

будет работать, потому что функция вставки из активной записи CI всегда возвращает TRUE (успешно или нет). Если вы используете режим отладки, CI остановится при ошибке и выдаст пользователю экранное сообщение, но функция вставки все равно вернет TRUE.

Итак, если вы хотите управлять транзакциями "вручную" с помощью CI, вам придется использовать что-то вроде этого:

...

$this->db->trans_begin();

$this->db->insert('FOO');

if ($this->db->trans_status() === FALSE){

    $this->db->trans_rollback();

}else{

    $this->db->trans_commit();

}

Надеюсь, это кому-нибудь поможет ... когда-нибудь .... где-то

1 голос
/ 20 апреля 2010

Может быть, это потому, что вы подключились с помощью $ dog_db и откатили несуществующую транзакцию $ booze_db? (Или это опечатка?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...