Rails Transaction
Nov 23, 2023
Pessimistic Locking vs Optimistic Locking: Mencegah Lost Updates [Ferry Suhandri]
Solution :
Timeout transaction, rollback
select * from accounts where id in (‘A’,’B’) for Update
for update nowait
Pessimistic Locking
Pessimistic Locking adalah proses penguncian data terhadap perubahan dari sesi lain yang dilakukan dari sisi Database.
ActiveRecord::Base.transaction do
# SELECT * FROM INVOICES WHERE id=? FOR UPDATE
invoice = Invoice.lock.find(invoice_id)
return unless invoice.status == 'new'
invoice.create_payment
invoice.update(status: 'paid')
end
Or
invoice = Invoice.lock("FOR UPDATE NOWAIT").find(invoice_id)
Or
invoice = Invoice.find(invoice_id)
invoice.with_lock do
(..)
end
Optimistic Locking
Optimistic Locking adalah proses penguncian data terhadap perubahan dari sesi lain yang dilakukan dari sisi algoritma aplikasi
using locking_column