mirror of
https://github.com/jbranchaud/til
synced 2026-01-03 07:08:01 +00:00
23 lines
828 B
Markdown
23 lines
828 B
Markdown
# All or Nothing Database Transactions
|
|
|
|
When you are updating multiple records in an *all or nothing* scenario, you
|
|
can use [Active Record
|
|
Transactions](http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html)
|
|
to ensure that either everything is updated or none of it is updated.
|
|
|
|
For instance, if you are transferring *internet points* from one user's
|
|
account to another user's account, you need to be sure that the transfer
|
|
balances out. If updating one user is successful, but updating the other
|
|
fails, then there will be a discrepancy in the data. A transaction will
|
|
ensure that when any part of the update fails the entire transaction is
|
|
rolled back (at the database level).
|
|
|
|
```ruby
|
|
User.transaction do
|
|
user1.internet_points += 20
|
|
user2.internet_points -= 20
|
|
user1.save!
|
|
user2.save!
|
|
end
|
|
```
|