Bài học theo mô-đun (4/4)
Giao dịch: tất cả hoặc không có gì
giao dịch là một nhóm các hoạt động mà cơ sở dữ liệu xử lý như
một đơn vị: hoặc tất cả họ đều thành công hoặc không ai trong số họ rời bỏ
dấu vết. Đó là cách bạn tự bảo vệ mình khỏi sự mâu thuẫn khi một trình tự
của UPDATE/INSERT/DELETE phải nhất quán.
Cú pháp
BEGIN; -- apri la transazione
UPDATE …;
INSERT …;
DELETE …;
SELECT …; -- puoi anche solo leggere
COMMIT; -- conferma tutte le modifiche
-- oppure
ROLLBACK; -- annulla tutte le modifiche, come se nulla fosseMọi thứ giữa BEGIN và COMMIT đều là nguyên tử: không có kết nối nào khác
nhìn thấy trạng thái trung gian. Nếu chương trình gặp sự cố hoặc thực thi
ROLLBACK, cơ sở dữ liệu vẫn giữ nguyên như trước BEGIN.
Kịch bản cổ điển: chuyển giao
Ví dụ điển hình là việc chuyển nhượng cổ phiếu giữa các sản phẩm (hoặc tiền
chuyển giữa các tài khoản): hai UPDATE phải thành công cùng nhau,
không bao giờ người này có và người kia không.
BEGIN;
UPDATE products SET stock = stock - 1 WHERE id = 1;
UPDATE products SET stock = stock + 1 WHERE id = 2;
COMMIT;Nếu UPDATE thứ hai không thành công (ví dụ: lỗi ràng buộc CHECK), thì
ROLLBACK khôi phục kho sản phẩm 1 về giá trị ban đầu.
ROLLBACK: trình gỡ lỗi của DBA
BEGIN;
UPDATE customers SET city = 'X' WHERE id = 1;
SELECT first_name, city FROM customers WHERE id = 1; -- "vedo come è cambiato"
ROLLBACK;Một mẫu rất hữu ích để thử UPDATE trên dữ liệu thực: bạn
chạy nó, kiểm tra kết quả bằng SELECT trong cùng một giao dịch và
nếu điều đó không thuyết phục được bạn, bạn ROLLBACK — cơ sở dữ liệu chính xác như
đó là trước đây.
SAVEPOINT: khôi phục một phần
Trong giao dịch, bạn có thể tạo điểm trung gian:
BEGIN;
UPDATE customers SET city = 'A' WHERE id = 1;
SAVEPOINT step1;
UPDATE customers SET city = 'B' WHERE id = 2;
-- mi sono accorto che il secondo UPDATE è sbagliato:
ROLLBACK TO SAVEPOINT step1;
COMMIT; -- solo il primo UPDATE viene confermatoACID trong 30 giây
Giao dịch đảm bảo các thuộc tính ACID:
- Atomicity — tất cả hoặc không có gì;
- Ctính nhất quán - các ràng buộc vẫn được đáp ứng khi bắt đầu và kết thúc giao dịch;
- Isolation — các giao dịch đồng thời không có trạng thái trung gian (ở nhiều "cấp độ" khác nhau);
- Dkhả năng bảo mật —
COMMITthành công không bị mất ngay cả trong trường hợp xảy ra va chạm.
Đến lượt bạn
Trong một giao dịch: giảm tồn kho của sản phẩm 1 đi 1 và tăng tồn kho của sản phẩm 2 đi 1. Mở bằng BEGIN và đóng bằng COMMIT.
Hiển thị gợi ý
Cổ phiếu tham chiếu - 1 và cổ phiếu + 1 trong các mệnh đề SET tương ứng.
Giải pháp khả dụng sau 3 lần thử
Xem lại bài tập
Mở một giao dịch, thử cập nhật thành phố của khách hàng có id=1 thành 'Sperimentale', sau đó hủy thao tác bằng ROLLBACK. Cuối cùng, thành phố của khách hàng 1 phải là thành phố ban đầu ('Milano').
Hiển thị gợi ý
ROLLBACK hủy mọi thay đổi được thực hiện từ BEGIN trở đi.
Giải pháp khả dụng sau 3 lần thử