Transaction trong java là gì? Tại sao phải sử dụng Transaction và ACID transactions?

Transaction trong java là gì? Tại sao phải sử dụng Transaction và ACID transactions?

Chia sẻ kiến thức 08/03/2022

“Em có biết gì về Transaction không?”. Chắc hẳn các bạn đã từng gặp câu hỏi này khi phỏng vấn xin việc. Thật đáng tiếc nếu phải tự mình thốt ra “Em không biết ạ!” hoặc “Em có nghe qua rồi nhưng….”

Hãy cùng FUNiX tìm hiểu về Transaction trong java để tự tin trong công việc

1. Công Dụng

Trước tiên hãy đi vào ví dụ “huyền thoại” đã từng xuất hiện trong nhiều bài viết:

  • Hôm nay là ngày mà bạn phải thực hiện nghĩa vụ chuyển tiền cho Vợ hàng tháng

  • Bạn đã thực hiện chuyển 3 tỉ (nhiều nhiều mới sót) và tài khoản của bạn đã bị trừ tiền.

  • Có một lỗi trong hệ thống mà tài khoản của vợ bạn không nhận được nhưng tài khoản của bạn vẫn bị trừ tiền

    => Và rồi bạn bị mang tiếng trễ hạn và giấu quỹ đen.

Đó là hậu quả rất thực tế của việc không áp dụng Transaction. Nếu áp dụng, Transaction sẽ có 2 hành động (operations):

  • Tài khoản của bạn đã bị trừ 2 tỉ
  • Tài khoản của vợ vừa được cộng thêm 2 tỉ

Nếu một trong 2 hành động trên bị lỗi thì Transaction sẽ tự động hủy và tài khoản của bạn sẽ không bị thay đổi, quá an toàn đúng không. Chính vì ràng buộc trên nên Transaction đã được ứng dụng nhiều trong các hành động yêu cầu độ tin cậy, đảm bảo được tính chính xác dữ liệu…

  • Nhóm các hoạt động của một tác vụ

  • Nếu có lỗi xảy ra trong Transaction thì tất cả các tác vụ sẽ thất bại

  • Đảm bảo được tính toàn vẹn của phiên làm việc với cớ sở dữ liệu

    => Đó là 3 công dụng của Transaction!

2. Các loại Transaction

Transaction được chia làm 2 loại chính:

  • Flat Transaction: Thực thi các operation là tuần tự từ trái sang phải hay từ trên xuống dưới

    Flat Transaction

  • Nested Transaction: Các operation được lồng nhau, việc thực thi các operation dựa theo nguyên tắc từ trong ra ngoài

    Nested Transaction

3. ACID Transaction

Đây là viết tắt các tính chất trong Transaction. Ta sẽ đi vào từng chữ cái ACID.

  • Atomicity – Tính đơn vị
    • Transaction sẽ xác định ra ranh giới một cách rõ ràng điểm đầu – điểm cuối là gì, tức là điểm bắt đầu và điểm kết thúc. Có ý nghĩa đơn giản là nếu một thành phần nào đó trong transaction thực thi bị lỗi thì đồng nghĩa với việc không có gì xảy ra về mặt dữ liệu.
  • Consistency – Tính nhất quán
    • Dữ liệu được nhất quán từ thời điểm bắt đầu đến thời điểm kết thúc
    • Đảm bảo Db thay đổi chính xác theo các trạng thái mà Transaction thực hiện
  • Durability – Tính bền vững (chữ cái I trong ACID sẽ nói ở phần cuối)
    • Dữ liệu của Transaction sau khi được thực thi được cố định, không có chuyện có thể chuyển lại
    • Hiểu đơn giản là nếu đã chuyển tiền đi rồi thì bạn sẽ mất 2 tỉ trong tài khoản chứ không có chuyện 2 tỉ của bạn được giữ nguyên.
  • Isolation – Tính độc lập
    • Các transaction có khả năng hoạt động một cách độc lập và không liên quan gì đến nhau.

Tạm thời các bạn cứ quan sát trong mô hình sau:

Isolation MindMap

  • Isolation được xác định qua 3 hiện tượng sau:

    • Dirty reads: VD – Bạn sẽ cập nhật dữ liệu mới lên tài khoản cá nhân trong Công ty, sếp của bạn nhìn vào số liệu bạn đã cập nhật để báo lên cấp trên. Trong một ngày nào đó, bạn chủ quan cập nhật dữ liệu mà không kiểm tra lại. Hệ thống có lỗi khiến dữ liệu không được commit thành công và sẽ trở thành dữ liệu cũ

    • Nonrepeatable reads: VD – Bạn cập nhật dữ liệu lên tài khoản Công ty, sếp bạn xem và tổng hợp, báo cáo lên cấp trên. Bạn nhận ra đã cập nhật sai và quyết định xóa đi để nhập lại. Vô tình sếp bạn nhìn lại và nhận ra các giá trị đã bị thay đổi trong khi báo cáo lên cấp trên rồi

    • Phantom reads: VD – Sếp bạn tổng hợp dữ liệu để đáp ứng lại một số yêu cầu của cấp trên. Bạn cũng tổng hợp một bản dữ liệu khác muốn giúp sếp một tay và nộp lên. Sếp nhìn vào 2 bản tổng hợp, nhận ra có sự khác nhau và phân vân không biết nộp cái nào chính xác hơn.

Như vậy, để tránh các hiện tượng trên để dẫn đến việc bị “sếp chửi” thì cần phải khóa dữ liệu, không cho những tiến trình khác đụng vào dữ liệu khi Transaction đang làm việc. Có 3 loại khóa khác nhau:

  • Write locks
  • Read locks
  • Range locks

Các levels dưới đây có thể chia ra các mức độ khoá khác nhau:

  • Read uncommitted: Vẫn có thể đọc được các bản ghi đang được câp nhật của các Transaction tại thời điểm đó
  • Read committed: Phải đợi dữ liệu của Transaction đó được cập nhật xong => Khắc phục được hiện tượng Dirty reads
  • Repeatable read: Giống Read uncommitted nhưng cao hơn một bậc ngăn Transaction không ghi vào dữ liệu đang được đọc bởi Transaction khác
  • Serializable: Mực độ cao nhất, nếu Trans có mệnh đề điều kiện cũng cần đòi hỏi range lock => Khắc phục được Phantom reads

4. Kết:

>>> Nếu bạn đang có nhu cầu học lập trình trực tuyến, tìm hiểu ngay tại đây:

>>> Xem thêm các chủ đề hữu ích:

  • https://www.baeldung.com/cs/transactions-intro
  • https://techmaster.vn/posts/36862/transaction-trong-java-la-cai-veo-gi-tai-sao-phai-su-dung-transaction-acid-transactions

Lương Thuận 

ĐĂNG KÝ TƯ VẤN HỌC LẬP TRÌNH TẠI FUNiX

Bình luận (
0
)

Bài liên quan

  • Tầng 0, tòa nhà FPT, 17 Duy Tân, Q. Cầu Giấy, Hà Nội
  • info@funix.edu.vn
  • 0782313602 (Zalo, Viber)        
Chat Button
FUNiX V2 GenAI Chatbot ×

yêu cầu gọi lại