Khi nào chúng ta sử dụng after_commit trong Rails?

First thing first Để hiểu rõ hơn khi nào chúng ta nên dùng after_commit thì chúng ta cùng xem qua một ví dụ sau. Giả sử chúng ta có một tính năng thêm người dùng vào một nhóm, mỗi khi người dùng được thêm vào nhóm, chúng ta cần gửi email thông báo đến người

ActiveRecord Callback

First thing first

Để hiểu rõ hơn khi nào chúng ta nên dùng after_commit thì chúng ta cùng xem qua một ví dụ sau.
Giả sử chúng ta có một tính năng thêm người dùng vào một nhóm, mỗi khi người dùng được thêm vào nhóm, chúng ta cần gửi email thông báo đến người quản trị của nhóm thông tin của người dùng vừa mới được thêm vào.

Thông thường, để xử lý trường hợp này, đa số chúng ta sẽ nghĩ ngay đến callback after_save. Rõ ràng, với callback này, vấn đề của chúng ta đã được giải quyết.

classUser<ApplicationRecord
    after_save :send_email_notificationsdefsend_email_notifications# Send email notifications in the backgroundSendEmailNotifications.perform_later(self.id)endend

Thoạt nhìn, tuởng chừng mọi thứ sẽ hoạt động trơn tru, nhưng ngẫm đi ngẫm lại có thể chúng ta đã không xử lý hết các trường hợp sẽ xảy ra. Đoạn code trên sẽ gặp vấn đề. Vậy vấn đề ở đây là gì?

Problem

Như chúng ta đã biết, after_save callback sẽ được thực thi sau khi record đã được lưu xuống database, nhưng lúc này transaction vẫn chưa hoàn thành. Database sẽ thực thi mọi thứ trong một transaction, nếu có lỗi xảy ra làm cho transaction bị lỗi thì mọi thứ trong transaction đó được revert trở lại.

Quay lại với tính năng thêm người dùng vào nhóm của chúng ta, nếu có lỗi xảy ra, database sẽ revert lại việc thêm người dùng vào nhóm.
Và việc gửi mail đã được chạy backgroundjob, sẽ trả vể ngoại lệ NotFound vì nó không tìm được ID của người dùng.

Solve

Vậy để giải quyết trường hợp này, after_commit callback sẽ giúp chúng ta.

after_commit

Dùng callback này sẽ đảm bảo method send_email_notifcations được thực thi chỉ khi nào transaction thành công và dữ liệu đã được ghi xuống database.

classUser<ApplicationRecord
    after_commit :send_email_notifications, on::createdefsend_email_notifications# Send email notifications in the backgroundSendEmailNotifications.perform_later(self.id)endend

Nguồn: viblo.asia

Bài viết liên quan

Tấn Công Ứng Dụng Web: Mối Đe Dọa Hàng Đầu – Phần 2

viết lại nội dung này ” Phát hiện các cuộc tấn công Cross Site Scripting (XSS)

AI Chatbot 2025: Xu Hướng Tất Yếu Cho Doanh Nghiệp Dẫn Đầu

Giới thiệu AI chatbots đã trải qua một hành trình đáng kể, từ những công cụ t

Tấn Công Ứng Dụng Web: Mối Đe Dọa Hàng Đầu – Phần 1

Tấn công web là gì? Ứng dụng web là các ứng dụng cung cấp dịch vụ cho người

SEO Mũ Trắng, Mũ Đen, Mũ Xám: Hiểu Biết và Lựa Chọn Phù Hợp

SEO Mũ Trắng, Mũ Đen, Mũ Xám: Hiểu Biết và Lựa Chọn Phù Hợp Trong kỷ nguyên s