SQL - Giao dịch: Hướng dẫn cho người mới bắt đầu

Xin chào các bạn tương lai của các nhà thuật toán cơ sở dữ liệu! Hôm nay, chúng ta sẽ bắt đầu một hành trình thú vị vào thế giới của các giao dịch SQL. Đừng lo lắng nếu bạn chưa từng viết một dòng mã trước đây - tôi sẽ là người hướng dẫn thân thiện của bạn, và chúng ta sẽ cùng khám phá chủ đề này từng bước một. Vậy, hãy lấy một cốc cà phê (hoặc trà, nếu đó là sở thích của bạn), và chúng ta cùng bắt đầu nhé!

SQL - Transactions

Giao dịch SQL là gì?

Hãy tưởng tượng bạn đang ở máy ATM, rút tiền từ tài khoản của mình. Quá trình này bao gồm nhiều bước: kiểm tra số dư, bớt đi số tiền, và phát tiền mặt. Bây giờ, nếu máy gặp sự cố giữa chừng thì sao? Bạn không muốn mất tiền của mình, phải không? Đây là lúc các giao dịch phát huy tác dụng!

Trong SQL, một giao dịch là một chuỗi các thao tác được coi là một đơn vị công việc duy nhất. Nó giống như một quả bóng bảo vệ xung quanh các thao tác cơ sở dữ liệu của bạn, đảm bảo rằng hoặc tất cả chúng đều thành công, hoặc không có thao tác nào thành công. Bằng cách này, dữ liệu của bạn sẽ luôn nhất quán và đáng tin cậy.

Hãy xem một ví dụ đơn giản:

BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 123;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 456;
COMMIT;

Trong giao dịch này, chúng ta đang chuyển $100 từ một tài khoản sang tài khoản khác. Lệnh BEGIN TRANSACTION đánh dấu bắt đầu giao dịch của chúng ta, và COMMIT hoàn tất nó. Nếu có bất kỳ điều gì xảy ra sai sót giữa hai điểm này, toàn bộ giao dịch có thể bị đảo ngược, giữ cho các tài khoản của chúng ta luôn cân bằng.

Các tính chất của giao dịch

Giao dịch có bốn tính chất chính, thường được nhớ bằng từ viết tắt ACID. Hãy cùng phân tích chúng:

Nguyên tử tính (Atomicity)

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

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

Nhất quán tính đả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. Đó giống như việc đảm bảo bạn luôn có số tiền chính xác trong ví của mình, bất kể bạn đã thực hiện bao nhiêu giao dịch.

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

Tách biệt tính giữ cho các giao dịch分开 từ nhau. Nó giống như việc có một phòng riêng trong một ngôi nhà chung - những gì xảy ra trong giao dịch của bạn sẽ ở lại trong giao dịch đó cho đến khi nó hoàn tất.

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

Bền vững tính đảm bảo rằng một khi một giao dịch được cam kết, nó sẽ luôn được cam kết. Nó giống như việc刻字 vào cây - chúng sẽ vẫn còn đó ngay cả khi có bão.

Lệnh kiểm soát giao dịch

Bây giờ chúng ta đã hiểu giao dịch là gì và tại sao chúng quan trọng, hãy xem xét các lệnh chúng ta sử dụng để kiểm soát chúng. Tôi sẽ trình bày chúng trong một bảng dễ tham khảo:

Lệnh Mô tả
BEGIN TRANSACTION Bắt đầu một giao dịch mới
COMMIT Lưu các thay đổi trong giao dịch
ROLLBACK Đảo ngược các thay đổi trong giao dịch
SAVEPOINT Tạo một điểm trong giao dịch để sau này có thể quay lại
RELEASE SAVEPOINT Xóa một điểm lưu trong giao dịch
SET TRANSACTION Xác định các đặc tính cho giao dịch

Hãy cùng khám phá chi tiết từng lệnh này!

Lệnh COMMIT

Lệnh COMMIT giống như việc nhấn nút "Lưu" trong một trò chơi video. Nó hoàn tất tất cả các thay đổi trong giao dịch. Dưới đây là cách bạn sử dụng nó:

BEGIN TRANSACTION;
INSERT INTO students (name, age) VALUES ('Alice', 20);
UPDATE courses SET available_seats = available_seats - 1 WHERE course_id = 101;
COMMIT;

Trong ví dụ này, chúng ta đang đăng ký Alice vào một khóa học. Chúng ta thêm cô ấy vào bảng học sinh và giảm số chỗ còn lại. Lệnh COMMIT ở cuối làm cho các thay đổi này trở thành vĩnh viễn.

Lệnh ROLLBACK

ROLLBACK là nút "Hoàn tác" của bạn. Nếu có điều gì đó xảy ra sai sót trong quá trình giao dịch, bạn có thể sử dụng ROLLBACK để hủy bỏ tất cả các thay đổi và quay lại trạng thái trước khi giao dịch bắt đầu.

BEGIN TRANSACTION;
DELETE FROM students WHERE name = 'Bob';
-- Ồ! Chúng ta không có ý định xóa Bob!
ROLLBACK;

Ở đây, chúng ta vô tình xóa Bob khỏi bảng học sinh. Nhưng đừng lo lắng! Lệnh ROLLBACK cứu nguy bằng cách đảo ngược việc xóa.

Lệnh SAVEPOINT

SAVEPOINT giống như tạo một điểm kiểm tra trong giao dịch của bạn. Bạn có thể tạo nhiều điểm kiểm tra và quay lại bất kỳ điểm nào nếu cần.

BEGIN TRANSACTION;
INSERT INTO courses (course_name, instructor) VALUES ('SQL 101', 'Prof. Smith');
SAVEPOINT new_course;

UPDATE instructors SET courses_taught = courses_taught + 1 WHERE name = 'Prof. Smith';
-- Ồ! Prof. Smith đang nghỉ học kỳ này
ROLLBACK TO new_course;

UPDATE instructors SET courses_taught = courses_taught + 1 WHERE name = 'Prof. Johnson';
COMMIT;

Trong ví dụ này, chúng ta tạo một điểm kiểm tra sau khi thêm một khóa học mới. Khi chúng ta nhận ra rằng chúng ta đã chỉ định sai giảng viên, chúng ta có thể quay lại điểm kiểm tra và thực hiện cập nhật đúng.

Lệnh RELEASE SAVEPOINT

Lệnh RELEASE SAVEPOINT xóa một điểm kiểm tra trong giao dịch mà bạn không còn cần nữa. Nó giống như việc xóa một điểm kiểm tra trong trò chơi khi bạn biết bạn sẽ không cần quay lại nó.

BEGIN TRANSACTION;
SAVEPOINT update_start;
UPDATE products SET price = price * 1.1;
-- Tăng giá thành công, chúng ta không cần điểm kiểm tra nữa
RELEASE SAVEPOINT update_start;
COMMIT;

Ở đây, chúng ta tạo một điểm kiểm tra trước khi cập nhật giá sản phẩm. Khi chúng ta chắc chắn rằng cập nhật là chính xác, chúng ta xóa điểm kiểm tra vì không còn cần nó nữa.

Lệnh SET TRANSACTION

Lệnh SET TRANSACTION cho phép bạn xác định các đặc tính cho giao dịch, chẳng hạn như mức độ tách biệt hoặc trạng thái chỉ đọc.

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN TRANSACTION;
SELECT * FROM sensitive_data;
COMMIT;

Trong ví dụ này, chúng ta đặt mức độ tách biệt của giao dịch là "READ COMMITTED" trước khi bắt đầu giao dịch. Điều này đảm bảo rằng chúng ta chỉ đọc dữ liệu đã được cam kết bởi các giao dịch khác, giúp ngăn chặn các đọc bẩn.

Và đó là tất cả rồi, các bạn! Chúng ta đã cùng nhau hành trình qua vùng đất của các giao dịch SQL, từ việc hiểu chúng là gì đến việc thành thạo các lệnh kiểm soát chúng. Nhớ rằng, thực hành là cách tốt nhất để trở nên hoàn hảo, vì vậy đừng ngần ngại thử nghiệm các khái niệm này trong một môi trường thử nghiệm an toàn.

Giao dịch có thể看起来 abstract ban đầu, nhưng chúng giống như mạng an toàn của thế giới cơ sở dữ liệu. Chúng giữ cho dữ liệu của chúng ta nhất quán và các ứng dụng của chúng ta đáng tin cậy. Vậy lần tới khi bạn làm việc trên một dự án cơ sở dữ liệu, hãy nhớ bao bọc các thao tác quan trọng của bạn trong các giao dịch - bản thân tương lai của bạn (và người dùng của bạn) sẽ cảm ơn bạn!

Chúc các bạn may mắn và các giao dịch của bạn luôn cam kết thành công!

Credits: Image by storyset