Mục tiêu: Hiểu bản chất Transaction, ACID, COMMIT, ROLLBACK và các câu hỏi thường gặp khi phỏng vấn Backend/DevOps.

1. Transaction là gì?

Transaction là một đơn vị xử lý trong Database, bao gồm một hoặc nhiều câu lệnh SQL được thực thi như một khối thống nhất.

  • COMMIT: Xác nhận và lưu các thay đổi.
  • ROLLBACK: Hoàn tác các thay đổi chưa được commit.
  • BEGIN: Bắt đầu transaction.

Khác biệt cốt lõi:

  • SQL thông thường (autocommit): Mỗi câu lệnh tự commit khi thành công.
  • Transaction tường minh: Nhiều câu lệnh có thể được commit hoặc rollback cùng nhau.

Lưu ý: Một lệnh SQL chạy ở chế độ autocommit cũng được Database thực thi trong một transaction ngầm.

2. Ví dụ: Chuyển tiền ngân hàng

Giả sử A có 10 triệu, B có 5 triệu. A chuyển cho B 2 triệu.

Không sử dụng Transaction tường minh

UPDATE accounts SET balance = balance - 2000000 WHERE id = 'A'; UPDATE accounts SET balance = balance + 2000000 WHERE id = 'B'; 

Nếu hệ thống lỗi sau lệnh đầu tiên:

  • A còn 8 triệu.
  • B vẫn có 5 triệu.
  • 2 triệu bị thất thoát về mặt dữ liệu.

Nguyên nhân: Lệnh đầu tiên đã commit nhưng lệnh thứ hai chưa thực hiện.

Sử dụng Transaction

BEGIN; UPDATE accounts SET balance = balance - 2000000 WHERE id = 'A'; UPDATE accounts SET balance = balance + 2000000 WHERE id = 'B'; COMMIT; 

Kết quả:

  • Thành công: A còn 8 triệu, B có 7 triệu.
  • Thất bại trước COMMIT: ROLLBACK, A vẫn có 10 triệu, B vẫn có 5 triệu.

Trong ứng dụng thực tế cần kiểm tra số dư, số dòng được cập nhật và xử lý lỗi để quyết định COMMIT hoặc ROLLBACK.

3. ACID — 4 đặc tính quan trọng

Đặc tính Ý nghĩa Ví dụ
Atomicity Tất cả hoặc không gì cả Chuyển tiền phải trừ A và cộng B
Consistency Dữ liệu giữ các ràng buộc hợp lệ Không vi phạm constraint
Isolation Kiểm soát transaction đồng thời Tránh đọc dữ liệu chưa commit
Durability Commit thành công thì dữ liệu được lưu bền vững DB crash vẫn phục hồi được dữ liệu đã commit

Mẹo nhớ: ACID = Nguyên tử – Nhất quán – Cô lập – Bền vững.

4. Transaction có rollback được sau COMMIT không?

Không. ROLLBACK thông thường chỉ hoàn tác thay đổi chưa commit.

Ví dụ:

BEGIN; DELETE FROM orders WHERE created_at < '2025-01-01'; COMMIT; 

Nếu phát hiện xóa nhầm sau COMMIT, không thể chạy ROLLBACK để khôi phục.

Các phương án xử lý:

  • Khôi phục từ Backup hoặc Point-in-Time Recovery (PITR).
  • Dùng dữ liệu lịch sử, audit log hoặc CDC nếu có.
  • Thực hiện corrective migration để sửa dữ liệu.
  • Khôi phục vào DB phụ rồi chọn lọc dữ liệu cần phục hồi.

5. Transaction và CI/CD Rollback

Giả sử deploy ứng dụng từ V1 lên V2:

  1. Migration thay đổi cấu trúc Database.
  2. Ứng dụng V2 ghi dữ liệu theo cấu trúc mới.
  3. V2 xảy ra lỗi.
  4. CI/CD rollback code về V1.

Vấn đề: Rollback code không đồng nghĩa rollback Database.

Loại rollback Ý nghĩa
Transaction rollback Hoàn tác thay đổi chưa commit
Application rollback Đưa code về phiên bản cũ
Database rollback Khôi phục hoặc điều chỉnh schema/data
PITR Khôi phục DB về một thời điểm trước đó

Best practice:

  • Dùng chiến lược Expand – Migrate – Contract khi thay đổi schema.
  • Thiết kế migration tương thích cả V1 và V2 trong giai đoạn chuyển tiếp.
  • Backup và kiểm thử khôi phục trước các thay đổi nguy hiểm.
  • Không phụ thuộc vào transaction để rollback toàn bộ quá trình deploy.

6. Câu hỏi phỏng vấn thường gặp

Q1. Transaction khác SQL thông thường thế nào?

Transaction nhóm nhiều thao tác thành một đơn vị xử lý có thể COMMIT/ROLLBACK cùng nhau. SQL riêng lẻ ở chế độ autocommit tự xác nhận sau mỗi câu lệnh thành công.

Q2. Transaction có đảm bảo không mất dữ liệu không?

Transaction hỗ trợ tính toàn vẹn và độ bền dữ liệu qua ACID, nhưng không thay thế backup, replication hoặc disaster recovery.

Q3. COMMIT rồi có ROLLBACK được không?

Không. Cần khôi phục dữ liệu hoặc thực hiện thao tác bù.

Q4. Transaction có làm Database chậm không?

Có thể. Transaction kéo dài giữ lock và tài nguyên lâu hơn, gây blocking, deadlock hoặc giảm throughput.

Q5. Hai Transaction chạy đồng thời có vấn đề gì?

Có thể xảy ra dirty read, non-repeatable read, phantom read hoặc các bất thường ghi dữ liệu. Cần lựa chọn isolation level phù hợp.

Q6. Transaction có rollback được ALTER TABLE không?

Tùy Database. PostgreSQL hỗ trợ rollback nhiều thao tác DDL; MySQL thường implicit commit đối với DDL như ALTER TABLE.

Q7. Rollback code có tự rollback dữ liệu không?

Không. Code, schema và dữ liệu có vòng đời riêng, cần chiến lược rollback và tương thích riêng.

7. Tổng kết nhanh

5 điều cần nhớ khi phỏng vấn:

  1. Transaction là đơn vị thực thi logic, không phải một loại câu lệnh SQL.
  2. ACID giúp bảo đảm tính đúng đắn của giao dịch.
  3. COMMIT xác nhận thay đổi; ROLLBACK hoàn tác thay đổi chưa commit.
  4. Transaction dài có thể gây lock contention và ảnh hưởng hiệu năng.
  5. Transaction rollback ≠ Code rollback ≠ Database recovery.

Một câu trả lời phỏng vấn tốt: "Transaction là cơ chế của Database giúp nhóm các thao tác thành một đơn vị xử lý tuân thủ ACID. Nó bảo đảm các thay đổi trong giao dịch được commit hoặc rollback như một khối, nhưng không thể rollback thông thường sau khi commit. Với production, cần kết hợp transaction, backup, migration tương thích ngược và chiến lược phục hồi dữ liệu."