0

I'm new to transactions in general, but especially with CodeIgniter. I'm using InnoDB and everything, but my transactions aren't rolling back when I want them to. Here's my code (slightly simplified).

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

I'm not getting any error messages, but it's not rolling back either. It should roll back at that final trans_rollback right before the commit. My models are all on the "dog" database, so I think that the transaction would carry into the models' functions. Maybe you just can't use models like this. Any help would be greatly appreciated! Thanks!

2 Answers 2

2

Well, I know this post is antique, but here's my 2 cents:

I don't think this:

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

will work, cause the insert function from CI active record always returns TRUE (succeeding or not). If you are using debug mode, CI will stop on error and throw a screen message to the user, but insert function will still returns TRUE.

So, if you're willing to control transactions "manualy" with CI, you'll have to use something like this:

... $this->db->trans_begin(); $this->db->insert('FOO'); if ($this->db->trans_status() === FALSE){ $this->db->trans_rollback(); }else{ $this->db->trans_commit(); } 

Hope this helps someone...sometime....somewhere

Sign up to request clarification or add additional context in comments.

Comments

1

Maybe, it's because you connected using $dog_db, and rolling back nonexisting $booze_db transaction ?(or it's a typo?)

1 Comment

Yeah, it's a typo, haha. Edited.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.