1. Transaction là gì?
Transaction (giao dịch) trong cơ sở dữ liệu là một nhóm thao tác được thực hiện như một đơn vị công việc. Những thao tác này thường liên quan đến việc thêm, sửa hoặc xóa dữ liệu và cần được quản lý để bảo đảm dữ liệu không rơi vào trạng thái không nhất quán khi xảy ra lỗi.
Ví dụ, khi người dùng chuyển tiền từ tài khoản A sang tài khoản B, hệ thống cần thực hiện hai thao tác: trừ tiền trong tài khoản A và cộng tiền vào tài khoản B. Nếu hệ thống trừ tiền ở tài khoản A thành công nhưng xảy ra lỗi trước khi cộng tiền vào tài khoản B, dữ liệu sẽ không còn chính xác nếu không có cơ chế xử lý phù hợp.
Transaction giúp giải quyết vấn đề này bằng cách nhóm các thao tác liên quan vào cùng một giao dịch. Nếu tất cả thao tác đều thành công, hệ thống xác nhận giao dịch. Nếu xảy ra lỗi, hệ thống có thể hủy các thay đổi thuộc giao dịch chưa được xác nhận.
Hai lệnh thường được sử dụng để quản lý transaction là COMMIT và ROLLBACK. COMMIT xác nhận các thay đổi của giao dịch, còn ROLLBACK hủy những thay đổi chưa được xác nhận trong giao dịch đó.

2. ACID là gì?
ACID là tập hợp bốn thuộc tính quan trọng giúp bảo đảm tính đáng tin cậy của transaction trong cơ sở dữ liệu, bao gồm Atomicity, Consistency, Isolation và Durability.
Bốn thuộc tính này giúp các thao tác dữ liệu được thực hiện an toàn hơn, đặc biệt trong những hệ thống có nhiều người dùng cùng truy cập hoặc thực hiện các giao dịch quan trọng như ngân hàng, thương mại điện tử và quản lý đơn hàng.
ACID không phải là một câu lệnh SQL riêng lẻ mà là tập hợp các nguyên tắc mà hệ quản trị cơ sở dữ liệu sử dụng để quản lý giao dịch. Mỗi thuộc tính giải quyết một khía cạnh khác nhau của việc bảo đảm dữ liệu chính xác và nhất quán.
3. Atomicity – Tính nguyên tử
Atomicity có nghĩa là một transaction được xử lý theo nguyên tắc tất cả hoặc không có gì. Nếu toàn bộ thao tác trong giao dịch thành công, hệ thống có thể xác nhận giao dịch. Nếu một thao tác thất bại trước khi giao dịch được xác nhận, những thay đổi thuộc giao dịch sẽ được hủy theo cơ chế rollback.
Ví dụ, trong quá trình đặt hàng, hệ thống cần tạo đơn hàng và ghi nhận các sản phẩm thuộc đơn hàng đó. Nếu đơn hàng đã được tạo nhưng thao tác lưu chi tiết đơn hàng thất bại, hệ thống cần xử lý để tránh tình trạng đơn hàng chỉ được lưu một phần khi nghiệp vụ yêu cầu các thao tác này phải thành công cùng nhau.
Atomicity giúp hạn chế tình trạng dữ liệu bị thay đổi dở dang. Tuy nhiên, thuộc tính này chỉ bảo vệ những thao tác thực sự nằm trong transaction; các thao tác bên ngoài như gửi email hoặc gọi dịch vụ thanh toán cần có cơ chế xử lý riêng nếu muốn phối hợp nhất quán với giao dịch cơ sở dữ liệu.
4. Consistency – Tính nhất quán
Consistency có nghĩa là một transaction phải đưa cơ sở dữ liệu từ trạng thái hợp lệ này sang trạng thái hợp lệ khác, tuân theo những quy tắc và ràng buộc đã được thiết lập.
Ví dụ, hệ thống quản lý tài khoản có quy định số dư không được âm. Khi thực hiện giao dịch chuyển tiền, hệ thống phải kiểm tra số dư trước khi trừ tiền và bảo đảm kết quả cuối cùng không vi phạm quy tắc này.
Trong cơ sở dữ liệu, tính nhất quán được hỗ trợ bởi các ràng buộc như khóa chính, khóa ngoại, NOT NULL, UNIQUE và CHECK, kết hợp với các quy tắc nghiệp vụ do ứng dụng triển khai.
Nếu dữ liệu đầu vào vi phạm một ràng buộc được áp dụng, cơ sở dữ liệu có thể từ chối thao tác. Nhờ đó, hệ thống hạn chế lưu những dữ liệu không hợp lệ. Tuy nhiên, Consistency không tự động bảo đảm mọi quy tắc nghiệp vụ; lập trình viên vẫn cần thiết kế các kiểm tra phù hợp.
5. Isolation – Tính cô lập
Isolation là thuộc tính giúp các transaction hoạt động đồng thời mà hạn chế ảnh hưởng không mong muốn giữa chúng. Khi có nhiều người dùng cùng đọc hoặc cập nhật dữ liệu, hệ thống cần kiểm soát để những giao dịch không tạo ra kết quả sai lệch.
Ví dụ, một sản phẩm chỉ còn một chiếc trong kho nhưng hai người dùng cùng đặt mua gần như đồng thời. Nếu cả hai request đều đọc được số lượng tồn kho là một trước khi thực hiện cập nhật, hệ thống có nguy cơ xác nhận nhiều đơn hàng hơn số lượng thực tế.
Cơ chế cô lập giao dịch giúp kiểm soát những tình huống như vậy, tùy theo mức độ cô lập và cách thiết kế câu truy vấn. Các hệ quản trị cơ sở dữ liệu có thể hỗ trợ nhiều mức cô lập khác nhau, chẳng hạn Read Committed, Repeatable Read và Serializable.
Mức cô lập càng cao thường cung cấp các bảo đảm mạnh hơn nhưng có thể làm giảm khả năng xử lý đồng thời hoặc tăng nguy cơ giao dịch phải thử lại. Vì vậy, cần chọn mức phù hợp với yêu cầu nghiệp vụ và hệ quản trị cơ sở dữ liệu đang sử dụng.
6. Durability – Tính bền vững
Durability có nghĩa là sau khi transaction đã được xác nhận thành công bằng COMMIT, những thay đổi của giao dịch được bảo đảm tồn tại theo các cam kết về độ bền của hệ quản trị cơ sở dữ liệu, kể cả khi xảy ra sự cố hệ thống thuộc phạm vi được bảo vệ.
Ví dụ, khi khách hàng đặt hàng thành công và server đã xác nhận giao dịch, thông tin đơn hàng cần được lưu lại để hệ thống có thể truy xuất sau đó, thay vì biến mất khi ứng dụng khởi động lại.
Các hệ quản trị cơ sở dữ liệu thường sử dụng những cơ chế như ghi nhật ký giao dịch và phục hồi dữ liệu để hỗ trợ tính bền vững. Tuy nhiên, mức độ bảo vệ thực tế còn phụ thuộc vào cấu hình hệ thống, chính sách sao lưu và các điều kiện triển khai.
Durability rất quan trọng đối với những hệ thống lưu trữ dữ liệu có giá trị cao như giao dịch tài chính, đơn hàng và thông tin thanh toán.
7. Ví dụ sử dụng Transaction trong SQL
Trong PostgreSQL và MySQL, lập trình viên có thể sử dụng transaction để nhóm nhiều thao tác dữ liệu vào cùng một giao dịch. Ví dụ sau minh họa việc chuyển tiền giữa hai tài khoản:
BEGIN;
UPDATE accounts
SET balance = balance - 100
WHERE id = 1 AND balance >= 100;
UPDATE accounts
SET balance = balance + 100
WHERE id = 2;
COMMIT;
Trong ví dụ này, BEGIN bắt đầu transaction, hai câu lệnh UPDATE thực hiện việc trừ tiền và cộng tiền, còn COMMIT xác nhận các thay đổi.
Tuy nhiên, đoạn code trên chỉ minh họa cách viết transaction cơ bản, chưa đủ để triển khai chuyển tiền an toàn trong thực tế. Ứng dụng cần kiểm tra số lượng bản ghi được cập nhật, xác nhận tài khoản nhận tồn tại và xử lý lỗi bằng ROLLBACK khi điều kiện nghiệp vụ không được đáp ứng. Cần chú ý rằng nếu câu lệnh trừ tiền không cập nhật bản ghi nào, câu lệnh cộng tiền phía sau vẫn có thể chạy nếu ứng dụng không kiểm tra kết quả.
Vì vậy, transaction cần được kết hợp với kiểm tra dữ liệu và xử lý lỗi phù hợp. Trong các hệ thống quan trọng, còn cần xem xét việc khóa dữ liệu, chống xử lý trùng request và ghi nhận lịch sử giao dịch.
8. Kết luận
Transactions and ACID là những kiến thức quan trọng khi làm việc với cơ sở dữ liệu, đặc biệt đối với các ứng dụng có nhiều thao tác dữ liệu liên quan đến nhau. Transaction giúp nhóm các thao tác thành một đơn vị công việc, còn ACID mô tả bốn thuộc tính hỗ trợ tính nguyên tử, tính nhất quán, tính cô lập và tính bền vững của giao dịch.
Qua quá trình tìm hiểu, mình hiểu rằng sử dụng transact








Khoá học lập trình game con rắn cho trẻ em




