Transaction gom nhiều câu lệnh thành một đơn vị: hoặc tất cả có hiệu lực, hoặc không câu nào.
Thiếu nó, luồng chuyển tiền có thể trừ tiền tài khoản A xong thì tiến trình dừng trước khi cộng cho B — số tiền đó mất hẳn.
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;ACID theo nghĩa vận hành:
- Atomicity — lỗi giữa chừng thì ROLLBACK gỡ sạch phần đã ghi, không để lại trạng thái nửa vời.
- Consistency — sau COMMIT, mọi ràng buộc còn đúng (CHECK balance >= 0, khoá ngoại, unique). Database giữ phần ràng buộc khai báo; quy tắc nghiệp vụ vẫn là việc của code.
- Isolation — các transaction chạy song song không thấy trạng thái dở dang của nhau; thấy được đến đâu do isolation level quyết định.
- Durability — đã COMMIT thì mất điện vẫn còn, nhờ ghi WAL xuống đĩa trước khi báo thành công.
Điểm hay bị hiểu nhầm: mở transaction không tự chống race condition. Hai transaction cùng đọc số dư cũ rồi cùng ghi đè vẫn cho kết quả sai — muốn chặn phải dùng khoá, câu lệnh cập nhật nguyên tử, hoặc isolation level cao hơn.