Tìm Hiểu Về Transaction và Thuộc Tính ACID Trong Cơ Sở Dữ Liệu
Transaction và Thuộc Tính ACID là hai trong số những khái niệm quan trọng khi tìm hiểu và làm việc với cơ sở dữ liệu. Transaction và thuộc tính ACID có liên quan mật thiết với nhau và trong bài viết này chúng ta sẽ tìm hiểu chi tiết về từng khái niệm thông qua những ví dụ đơn giản. Điều đầu tiên ...
Transaction và Thuộc Tính ACID là hai trong số những khái niệm quan trọng khi tìm hiểu và làm việc với cơ sở dữ liệu. Transaction và thuộc tính ACID có liên quan mật thiết với nhau và trong bài viết này chúng ta sẽ tìm hiểu chi tiết về từng khái niệm thông qua những ví dụ đơn giản.
Điều đầu tiên và cũng vô cùng quan trọng khi tìm hiểu về cơ sở dữ liệu đó là bạn cần nắm vững về khái niệm database transaction.
Database Transaction Là Gì
Một database transaction là một chuỗi bao gồm nhiều hành động khác nhau thực hiện trên cơ sở dữ liệu, các hành động này có mối quan hệ mật thiết lẫn nhau và được xem như là một đơn vị duy nhất.
Ví dụ: Công ty AAA mở tài khoản tại Ngân hàng Vietcomank với số tiền nạp vào bạn đầu là 500 triệu đồng. Một ngày đẹp trời, chị Alice là nhân viên phòng kết toán rút 20 triệu đồng để thưởng cho anh Bob vì thành tích xuất sắc trong tháng. Anh Bob cũng mở tài khoản ở ngân hàng Vietcombank và chị Alice chuyển khoản thưởng này vào tài khoản của anh Bob Vietcombank.
Nếu phân tích hành động chuyển tiền thưởng từ góc độ cơ sở dữ liệu thì hành động chuyển tiền được tách biệt thành hai hành động khác nhau:
- Trừ 10 triệu đồng từ tài khoản tiền gửi của công ty AAA.
- Cộng thêm 10 triệu đồng vào tài khoản tiền gửi của anh Bob.
Mặc dù được tách thành hai hành động riêng lẻ trên nhưng cả hai được gộp lại thành một transaction do chúng có mỗi quan hệ mật thiết lẫn nhau và chúng ta cần đảm bảo cả hai hành động này đều được thực hiện thành công hoặc sẽ không có hành động nào được thực hiện nếu như xảy ra lỗi trên database khiến một trong hai hành động không thực hiện được (ví dụ như ngay sau khi hành động đầu tiên diễn ra thì phòng server bị mất điện).
Đặc điểm của một transaction đó là các hành động trong transaction được coi là một đơn vị duy nhất và không cho phép bất cứ một hành động nào có thể được thực hiện thành công nếu như có một hoặc một vài hành động khác không được thực hiện. Trong ví dụ trên nếu như hành động đầu tiên gặp lỗi mà hành động thứ hai vẫn diễn ra thành công thì điều này sẽ dẫn tới việc anh Bob được nhận thêm 10 triệu nữa khi sau đó chị Alice thực hiện lại việc chuyển số tiền 10 triệu cho anh ta. Dĩ nhiên anh Bob sẽ cảm thấy vui vẻ về điều này nhưng chủ ngân hàng thì không hẳn có cảm giác như vậy.
Cũng cần chú ý đó là không phải các hành động nào diễn ra theo một chuỗi liên tiếp nhau cũng được coi là một transaction. Ví dụ sau không phải là một transaction:
- Bob chuyển 3 triệu từ tài khoản Vietcombank sang tải khoản tiết kiệm của anh ta tại Sacombank.
- Bob chuyển 5 triệu từ tài khoản Vietcombank sang tài khoản đầu tư chứng khoán của anh ta ở ACB.
- Bob rút 2 triệu từ tài khoản Vietcombank để đi nhậu với bạn bè.
Với ví dụ trên thì ngay cả khi thời gian chúng diễn ra gần nhau thì cũng không được coi là một transaction vì các hành động này có thể diễn ra tách biệt. Ví dụ hành động thứ 3 bị lỗi không khiến hành động thứ hai hoặc thứ nhất phải bị huỷ bỏ.
Phần tiếp theo đây chúng ta sẽ tìm hiểu về tính chất ACID của transaction.
ACID Transaction Là Gì
ACID là tính chất trong đó bao gồm tập hợp của 4 đặc tính khác nhau áp dụng cho một database transaction. Bốn đặc tính này gồm: atomicity (nguyên tử), consistency (nhất quán), isolation (độc lập), và durability (bễn vững). Từ ACID là từ viết tắt được ghép bởi các chữ cái đầu tiên của 4 từ trên.
Đặc Tính Nguyên Tử (Atomicity)
Đặc tính nguyên tử (atomicity hay còn được gọi ngắn hơn là atomic) quy định rằng tất các hành động của một transaction cần được thực hiện thành công hoặc ngược lại nếu có một hành động không được thực hiện thì sẽ không có bất cứ hành động nào khác được thực hiện thành công.
Gọi là đặc tính nguyên tử bởi vì từng hành động riêng rẽ này giống như các electron quay xung quyanh một hạt nhân và khi hạt nhân di chuyển thì tất cả các electron này sẽ di chuyển cùng nhau mà không cho phép một electron nào rời khỏi quỹ đạo.
Đặc Tính Nhất Quán
Đặc tính nhất quán (consitency hay ngắn hơn là consistent) quy định tại bất kỳ thời điểm nào, trước hoặc sau một transaction được thực hiện dù lỗi hay không lỗi, thì database vẫn phải được giữ ở trạng thái hợp lệ (ví dụ dữ liệu phải phù hợp với các quy định được định nghĩa cho database).
Ở ví dụ chuyển tiền thưởng như đề cập ở đầu bài viết thì nếu như hành động chuyển tiền đầu tiên của transaction gặp phải lỗi thì hành động thứ hai sẽ cần cần phải được huỷ (hay rollback lại).
Đặc Tính Độc Lập
Đặc tính độc lập (isolation hoặc isolate) quy định từng transaction khác nhau cần phải được thực hiện trong một môi trường độc lập, nếu có 2 transaction diễn ra tại cùng một thời điểm thì cần một cơ chế đảm bảo transaction này không ảnh hưởng tới transaction khác.
Ví dụ nếu trong trường hợp có một khách hàng chuyển 10 triệu đồng vào tài khoản của công ty AAA tại Vietcombank ngay tại thời điểm chị Alice thực hiện việc rút 10 triệu đồng. Điều gì sẽ diễn ra? Lúc này database sẽ phải thực hiện hai hành động sau cùng một thời điểm:
- Thực hiện cập nhật số tiền trong tài khoản của công ty ACB bằng cách trừ đi 10 triệu từ số dư hiện tại (= 500 triệu = 10 triệu)
- Thực hiện cập nhật số tiền trong tài khoản của công ty ACB bằng cách cộng thêm 10 triệu từ số dư hiện tại (= 500 triệu + 10 triệu)
Tài khoản của công ty AAA ngân hàng Vietcombank sau hai hành động này cuối cùng sẽ là bao nhiêu 500 triệu (= 500 triệu - 10 triệu + 10 triệu) hay 510 triệu (500 triệu + 10 triệu) hay sẽ chỉ còn 490 triệu (500 triệu - 10 triệu)?
Với đặc tính độc lập của transaction được đưa ra để đảm bảo khi transaction diễn ra thì dữ liệu liên quan trên database sẽ bị khoá lại. Do đó các hành động khác (hay transaction khác) hoặc là sẽ phải đợi cho tới khi transaction ban đầu được hoàn tất hoặc là sẽ bị báo gặp phải lỗi.
Đặc Tính Bền Vững
Đặc tính bền vững (consistency hay consistent) quy định rằng khi transaction được diễn ra (thành công hoặc rollback lại khi có lỗi) thì sau đó dù có bất cứ sự cố nào diễn ra với database (mất điện, server tràn bộ nhớ...) thì khi được khôi phục lại thì dữ liệu được khôi phục sẽ giữ nguyên trạng thái trước khi có sự cố (đảm bảo không có bất cứ transaction trước đó không bị mất).
Ví dụ như sau khi transaction chuyển tiền thưởng ở ví dụ đầu tiên được diễn ra thành công và 3 giờ sau đó phòng server bị mất điện thì khi khôi phục lại dữ liệu cho database (sử dụng dữ liệu được tự động sao lưu trước đó 1 phút) thì transaction này (cũng như tất cả các transaction diễn ra trước thời điểm server thực hiện việc tự động sao lưu) cần được khôi phục lại và thể hiện ở cơ sở dữ liệu sau khi khôi phục.
Kết Luận
Hai khái niệm transaction và ACID trong cơ sở dữ liệu thường được đề cập khá thường xuyên trong các buổi phỏng vấn và mặc dù không phải là quá khó để có thể tiếp, tuy nhiên vẫn còn rất nhiều bạn khá lơ mơ về chúng. Hy vọng khi đọc xong bài viết này bạn đã có cái nhìn tổng quát về hai khái niệm này cũng như mối liên hệ giữa chúng. Trong các bài viết theo chúng ta sẽ tìm hiểu các tạo một transaction trong MySQL database.