Chuyển đến nội dung chính
Mô-đun 11 · Bài học 1 trong tổng số 441/57 trong khóa học~15 min
Bài học theo mô-đun (1/4)

Giao dịch ACID (BEGIN/COMMIT)

Nền tảng về độ tin cậy của mọi cơ sở dữ liệu đều dựa trên từ viết tắt ACID:

  • Atomicity: một thao tác hoàn thành hoàn toàn (Commit) hoặc không để lại dấu vết nào chưa hoàn thành (Rollback).
  • Ctính nhất quán: các quy tắc cơ sở dữ liệu (ví dụ: các ràng buộc, Khóa ngoại) luôn được tôn trọng.
  • Isolation: các giao dịch diễn ra cùng lúc không can thiệp lẫn nhau một cách thiếu kiểm soát.
  • Durability: sau một Cam kết, thay đổi sẽ được ghi vào đĩa mà không thể đảo ngược.

Cú pháp giao dịch

Thông thường, mỗi truy vấn CẬP NHẬT hoặc XÓA duy nhất được coi là một giao dịch độc lập (tự động xác nhận). Nhưng khi bạn muốn nhóm nhiều thao tác lại với nhau, chẳng hạn như ghi nợ tài khoản của khách hàng và đặt hàng, bạn phải thực hiện rõ ràng bằng cú pháp giao dịch.

SQL
BEGIN;

UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
INSERT INTO orders (user_id, total) VALUES (1, 100);

COMMIT; -- Writes the changes

Nếu trong quá trình thực thi phức tạp này, ứng dụng JavaScript đã gửi truy vấn nhận ra có sự cố (ví dụ: không có đủ hàng trong kho và bị lỗi), thì ứng dụng này sẽ gửi một thông báo:

SQL
ROLLBACK; -- Cancels the changes and discards the 2 queries sent in the block

Hãy tự mình thử

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

Mở một giao dịch.\nCập nhật sản phẩm có ID 10 đặt 'số lượng' của nó thành 0 trong bảng tạm thời (không chờ đã, 'số lượng' không có trên sản phẩm, hãy phát minh ra: thay đổi 'đơn_giá' trong 'order_items' nhưng điều đó yêu cầu một ràng buộc.\nHãy làm tốt hơn: Cập nhật trạng thái của ID đơn hàng 5 thành 'đã vận chuyển' và hoàn tất giao dịch thành công.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Bắt đầu bằng BEGIN;, thay đổi đơn hàng cho id = 5 thành trạng thái='shipped', sau đó gửi bằng COMMIT;

Giải pháp khả dụng sau 3 lần thử

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

Sự hoảng loạn trong sản xuất! Một nhà phát triển đã viết DELETE mà không có WHERE, trước đây đã xóa tất cả các bài đánh giá.\nHãy chỉ cho họ cách thực hiện khôi phục. Bắt đầu một giao dịch, thực hiện DELETE nhanh chóng để xóa mọi thứ khỏi 'đánh giá' (không có mệnh đề WHERE), nhưng sau đó sử dụng trình bảo vệ SQL để hoàn tác tác động trước khi hoàn thành khối.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

BEGIN;, xóa sạch các 'đánh giá', và sau đó là ROLLBACK kỳ diệu; ở cuối.

Giải pháp khả dụng sau 3 lần thử