What transaction do?
Before beginning , let’s read some code
# in /controllers/queue_items_controller.rb def update_queue begin update_queue_items normalize_queue_items_positions rescue ActiveRecord::RecordInvalid flash[:error] = "Invalid position numbers" end redirect_to my_queue_path end private def update_queue_items ActiveRecord::Base.transaction do params[:queue_items].each do |queue_item_data| queue_item = QueueItem.find(queue_item_data["id"]) queue_item.update_attributes!(position: queue_item_data["position"]) if queue_item.user == current_user end end end
Could you figure out what
Transactions do by reading the code above?
Let’s read the Rails documentation about Transactions:
Transactions are protective blocks where SQL statements are only permanent if they can all succeed as one atomic action.
So you have to deal multiple things with model(s), and you want to make sure that all of the things must be done successful then saving to the database. Just like you do the bank account: You deposit some money, sent to another account. Both two actions must be successful at the same time.
Exception handling and rolling back
If you want to use
ActiveRecord::Base.transaction , you have to use
begin...rescue statement to catch the rollback error. So in the code above, we use
update_attributes! with bang to raise
ActiveRecord::RecordInvalid~(this is raise by ~save!,
create! in ActiveRecord, reading the documentation for more)
That’s what the
some take away
- use in the controller
- try to catch the error
- use in multiple model manipulation in one action
- reading recommendation: Transactions in Rails