Hệ thống Quản lý Cơ sở Dữ liệu (DBMS) - Giao dịch: Hiểu biết Cơ bản và Nâng cao

Xin chào các nhà thuật toán tương lai! Tôi rất vui mừng được dẫn dắt các bạn vào thế giới kỳ diệu của các giao dịch cơ sở dữ liệu. Là một giáo viên khoa học máy tính ở khu phố gần bạn, tôi đã thấy rất nhiều sinh viên struggle với chủ đề này, nhưng tôi诺诺 các bạn, đến cuối bài hướng dẫn này, các bạn sẽ trở thành chuyên gia về giao dịch! Hãy cùng nhau khám phá!

DBMS - Transaction

Giao dịch là gì?

Trước khi chúng ta đi sâu vào chi tiết, hãy bắt đầu từ những điều cơ bản. Hãy tưởng tượng bạn đang ở máy ATM, rút tiền. Bạn chèn thẻ, nhập mã PIN, chọn số tiền, và nhận tiền mặt. Toàn bộ quá trình này, từ đầu đến cuối, là một giao dịch. Trong thuật ngữ cơ sở dữ liệu, một giao dịch là một chuỗi các thao tác được thực hiện như một đơn vị công việc logic duy nhất.

Dưới đây là một ví dụ đơn giản về giao dịch có thể trông như thế nào trong pseudocode:

BEGIN TRANSACTION
ĐỌC balance FROM account WHERE id = 12345
IF balance >= 100 THEN
CẬP NHẬT account SET balance = balance - 100 WHERE id = 12345
TRẢ 100 đô la
ELSE
HIỆN THỊ "Số dư không đủ"
END IF
COMMIT TRANSACTION

Giao dịch này đảm bảo rằng hoặc tất cả các bước đều hoàn thành thành công (tiền được rút và số dư được cập nhật) hoặc không có bước nào được hoàn thành (nếu không đủ tiền, không có thay đổi nào xảy ra).

Các Tính chất ACID

Bây giờ, hãy nói về bốn trụ cột của giao dịch, được gọi là các tính chất ACID. Những tính chất này rất quan trọng để duy trì tính toàn vẹn và nhất quán của dữ liệu trong hệ thống cơ sở dữ liệu.

Tính chất Nguyên tử (Atomicity)

Tính chất nguyên tử đảm bảo rằng một giao dịch được coi là một đơn vị không thể chia cắt. Cả hoặc không - hoặc tất cả các thao tác trong giao dịch đều hoàn thành thành công, hoặc không có thao tác nào hoàn thành.

Ví dụ:

BEGIN TRANSACTION;
CẬP NHẬT accounts SET balance = balance - 100 WHERE id = 'Alice';
CẬP NHẬT accounts SET balance = balance + 100 WHERE id = 'Bob';
COMMIT;

Nếu bất kỳ phần nào của giao dịch này thất bại (ví dụ: tài khoản của Bob không tồn tại), toàn bộ giao dịch sẽ được hoàn nguyên, và số dư của Alice sẽ không thay đổi.

Tính chất Nhất quán (Consistency)

Tính chất nhất quán đảm bảo rằng một giao dịch đưa cơ sở dữ liệu từ một trạng thái hợp lệ sang một trạng thái hợp lệ khác. Nó duy trì các ràng buộc toàn vẹn của cơ sở dữ liệu.

Ví dụ: Giả sử chúng ta có một quy tắc rằng tất cả các số dư tài khoản phải dương.

BEGIN TRANSACTION;
CẬP NHẬT accounts SET balance = balance - 200 WHERE id = 'Alice';
-- Nếu số dư của Alice trở thành âm, giao dịch sẽ bị hủy
COMMIT;

Tính chất Tách biệt (Isolation)

Tính chất tách biệt đảm bảo rằng việc thực thi đồng thời các giao dịch không làm thay đổi trạng thái của cơ sở dữ liệu so với trạng thái sẽ được đạt được nếu các giao dịch được thực thi tuần tự.

Ví dụ: Hãy tưởng tượng hai giao dịch chạy đồng thời:

-- Giao dịch 1
BEGIN TRANSACTION;
CẬP NHẬT accounts SET balance = balance - 100 WHERE id = 'Alice';
-- Một số độ trễ xảy ra ở đây
CẬP NHẬT accounts SET balance = balance + 100 WHERE id = 'Bob';
COMMIT;

-- Giao dịch 2
BEGIN TRANSACTION;
CHỌN balance FROM accounts WHERE id = 'Alice';
COMMIT;

Tính chất tách biệt đảm bảo rằng Giao dịch 2 sẽ hoặc thấy số dư của Alice trước khi chuyển tiền hoặc sau khi chuyển tiền, nhưng không bao giờ ở giữa.

Tính chất Bền vững (Durability)

Tính chất bền vững đảm bảo rằng khi một giao dịch đã được cam kết, nó sẽ vẫn như vậy, ngay cả trong trường hợp mất điện, crash hoặc lỗi.

Ví dụ: Sau khi thực thi giao dịch này:

BEGIN TRANSACTION;
CHÈN INTO audit_log (action, timestamp) VALUES ('User login', CURRENT_TIMESTAMP);
COMMIT;

Ghi chép đã chèn sẽ tồn tại ngay cả khi hệ thống crash ngay sau đó.

Tính chất Serializeability

Tính chất Serializeability là mức độ tách biệt cao nhất giữa các giao dịch. Nó đảm bảo rằng việc thực thi đồng thời các giao dịch dẫn đến một trạng thái của cơ sở dữ liệu mà sẽ được đạt được nếu các giao dịch này được thực thi tuần tự theo một thứ tự nào đó.

Hãy xem một ví dụ:

Giao dịch 1: R(X), W(X)
Giao dịch 2: R(X), W(X)

Các lịch trình serializeable có thể:

  1. T1 theo sau T2: R1(X), W1(X), R2(X), W2(X)
  2. T2 theo sau T1: R2(X), W2(X), R1(X), W1(X)

Một lịch trình đồng thời được coi là serializeable nếu kết quả của nó tương đương với một trong các lịch trình tuần tự này.

Lịch trình Tương đương

Hai lịch trình được coi là tương đương nếu:

  1. Chúng liên quan đến cùng một bộ giao dịch
  2. Chúng sắp xếp các thao tác xung đột của các giao dịch không bị hủy theo cùng một cách

Hãy xem một ví dụ:

Lịch trình 1: R1(X), R2(X), W1(X), W2(X) Lịch trình 2: R2(X), R1(X), W1(X), W2(X)

Các lịch trình này tương đương vì các thao tác xung đột (W1(X) và W2(X)) có cùng thứ tự trong cả hai lịch trình.

Trạng thái của Giao dịch

Các giao dịch trải qua các trạng thái khác nhau trong chu kỳ sống của chúng. Dưới đây là bảng tóm tắt các trạng thái này:

Trạng thái Mô tả
Active Trạng thái ban đầu; giao dịch ở trong trạng thái này trong khi nó đang thực thi
Partially Committed Sau khi câu lệnh cuối cùng đã được thực thi
Failed Sau khi phát hiện rằng không thể tiếp tục thực thi bình thường
Aborted Sau khi giao dịch đã được hoàn nguyên và cơ sở dữ liệu được khôi phục về trạng thái trước khi giao dịch bắt đầu
Committed Sau khi giao dịch hoàn thành thành công

Hiểu biết các trạng thái này là rất quan trọng để quản lý giao dịch hiệu quả và đảm bảo tính toàn vẹn của dữ liệu.

Cuối cùng, giao dịch là một khái niệm cơ bản trong hệ thống quản lý cơ sở dữ liệu, đảm bảo tính nhất quán và toàn vẹn của dữ liệu. Bằng cách hiểu các tính chất ACID, serializeability, lịch trình tương đương và trạng thái của giao dịch, các bạn đã trên đường trở thành chuyên gia về cơ sở dữ liệu!

Nhớ rằng, thực hành là cách tốt nhất để trở nên hoàn hảo. Hãy thử thực hiện các khái niệm này trong một hệ thống cơ sở dữ liệu thực tế, và các bạn sẽ thấy giao dịch có thể mạnh mẽ như thế nào. Chúc may mắn, các quản trị viên cơ sở dữ liệu tương lai!

Credits: Image by storyset