Chuyển đến nội dung chính
Mô-đun 8 · Bài học 4 trong tổng số 432/57 trong khóa học~10 min
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

SQL
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 fosse

Mọ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.

SQL
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

SQL
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:

SQL
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 confermato

ACID 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 — COMMIT thà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

tập thể dục#sql.m8.l4.e1
Nỗ lực: 0Đang tải…

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.

Đang tải trình chỉnh sửa…
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

tập thể dục#sql.m8.l4.e2
Nỗ lực: 0Đang tải…

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').

Đang tải trình chỉnh sửa…
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ử