Chào mừng bạn quay trở lại với series SQL Nâng Cao cùng MCNA Technology School!
Hãy tưởng tượng bạn đang chuyển 5,000,000 VNĐ cho bạn bè qua app ngân hàng. Hệ thống đã trừ tiền ở tài khoản của bạn, nhưng đúng lúc đó máy chủ bị mất điện và chưa kịp cộng tiền cho người nhận. Nếu không có cơ chế bảo vệ, số tiền đó sẽ “bốc hơi” vào hư không.
Để giải quyết triệt để rủi ro này trong các hệ thống doanh nghiệp, SQL sử dụng cơ chế TRANSACTION (Giao dịch) – giúp đảm bảo nguyên tắc “Tất cả cùng thành công, hoặc không có gì thay đổi cả”.
1. Transaction Trong SQL Là Gì? Tính Chất ACID
Transaction (Giao dịch) là một nhóm các câu lệnh SQL được thực thi như một đơn vị xử lý duy nhất. Một Transaction phải tuân thủ nghiêm ngặt 4 tính chất ACID:
-
Atomicity (Tính nguyên tử): Hoặc là toàn bộ các lệnh trong Transaction hoàn thành, hoặc không có lệnh nào được lưu (Tất cả hoặc Không).
-
Consistency (Tính nhất quán): Dữ liệu luôn đảm bảo các quy tắc toàn vẹn trước và sau khi giao dịch diễn ra.
-
Isolation (Tính cô lập): Các giao dịch đang chạy song song không can thiệp hay làm sai lệch dữ liệu của nhau.
-
Durability (Tính bền vững): Khi giao dịch đã thành công, dữ liệu sẽ được lưu vĩnh viễn vào hệ thống, kể cả khi mất điện ngay sau đó.
2. Bộ Ba Lệnh Cốt Lõi: BEGIN, COMMIT và ROLLBACK
Để điều khiển một Transaction, bạn cần phối hợp 3 câu lệnh chính:
-
BEGIN TRANSACTION(hoặcBEGIN TRAN): Đánh dấu điểm bắt đầu của một chuỗi thao tác. -
COMMIT TRANSACTION(hoặcCOMMIT): Xác nhận tất cả các thao tác đều hợp lệ và chính thức lưu vào Database. -
ROLLBACK TRANSACTION(hoặcROLLBACK): Hủy bỏ toàn bộ các thao tác vừa thực hiện, khôi phục dữ liệu về trạng thái trước khi gọiBEGIN.
Cú pháp cơ bản:
SQL
BEGIN TRANSACTION;
BEGIN TRY
-- 1. Các câu lệnh SQL làm thay đổi dữ liệu (INSERT, UPDATE, DELETE)
-- 2. Nếu không có lỗi, xác nhận lưu
COMMIT TRANSACTION;
PRINT N'Giao dịch thành công!';
END TRY
BEGIN CATCH
-- 3. Nếu xảy ra bất kỳ lỗi nào, hoàn tác dữ liệu lại từ đầu
ROLLBACK TRANSACTION;
PRINT N'Đã xảy ra lỗi! Giao dịch bị hủy bỏ.';
END CATCH;
⚠️ RỦI RO CHÁY DỮ LIỆU TRONG CÁC HỆ THỐNG GIAO DỊCH LỚN!
Viết sai một câu lệnh
COMMIThoặc quên đặtROLLBACKtrong môi trường Production có thể làm sai lệch hàng tỷ đồng doanh thu hoặc treo toàn bộ Cơ sở dữ liệu của doanh nghiệp.🚀 Tham gia Khóa học SQL Nâng Cao & System Architecture tại MCNA Technology School để:
Master kỹ thuật xử lý Deadlock (nghẽn giao dịch) và quản lý Isolation Levels.
Thực hành mô phỏng các sự cố hệ thống tài chính/ngân hàng thực tế.
Được cố vấn 1:1 bởi các Data Architect giàu kinh nghiệm.
👉 [ĐĂNG KÝ HỌC THỬ & TRẢI NGHIỆM LAB THỰC CHUYÊN NGHIỆP] (Điền link đăng ký)
3. Ví Dụ Thực Tế: Mô Phỏng Giao Dịch Chuyển Tiền
Cùng xem xét kịch bản chuyển 2,000,000 VNĐ từ tài khoản A (MaTK: 101) sang tài khoản B (MaTK: 102):
SQL
BEGIN TRANSACTION;
BEGIN TRY
-- Bước 1: Trừ tiền tài khoản A
UPDATE TaiKhoan
SET SoDu = SoDu - 2000000
WHERE MaTK = 101;
-- Kiểm tra nếu số dư tài khoản A bị âm (Vi phạm quy tắc business)
IF (SELECT SoDu FROM TaiKhoan WHERE MaTK = 101) < 0
BEGIN
RAISERROR(N'Số dư tài khoản không đủ!', 16, 1);
END
-- Bước 2: Cộng tiền tài khoản B
UPDATE TaiKhoan
SET SoDu = SoDu + 2000000
WHERE MaTK = 102;
-- Nếu cả 2 lệnh trên thành công -> Lưu dữ liệu
COMMIT TRANSACTION;
PRINT N'Chuyển tiền thành công!';
END TRY
BEGIN CATCH
-- Nếu có lỗi xảy ra -> Hoàn trả lại trạng thái cũ
ROLLBACK TRANSACTION;
PRINT N'Giao dịch thất bại: ' + ERROR_MESSAGE();
END CATCH;
4. Bài Tập Thực Hành SQL Nâng Cao (Bài 2)
Hãy áp dụng kiến thức TRANSACTION để xử lý bài toán đặt mua khóa học tại MCNA Technology School:
Đề bài: Cho 2 bảng:
KhoaHoc(MaKH,TenKH,SoLuongCon)
HoaDon(MaHD,MaHV,MaKH,NgayTao)Hãy viết một đoạn mã SQL có sử dụng Transaction để xử lý việc đặt mua khóa học
SQL-ADVcho học viênHV09:
Trừ số lượng còn lại của khóa
SQL-ADVđi 1 (SoLuongCon = SoLuongCon - 1).Thêm 1 dòng ghi nhận vào bảng
HoaDon.Nếu số lượng còn lại của khóa học bị giảm xuống dưới 0, hãy hủy toàn bộ giao dịch (
ROLLBACK) và thông báo “Khóa học đã hết chỗ”.
SQL
BEGIN TRANSACTION;
BEGIN TRY
-- 1. Giảm số lượng chỗ còn lại
UPDATE KhoaHoc
SET SoLuongCon = SoLuongCon - 1
WHERE MaKH = 'SQL-ADV';
-- Kiểm tra điều kiện số lượng
IF (SELECT SoLuongCon FROM KhoaHoc WHERE MaKH = 'SQL-ADV') < 0
BEGIN
RAISERROR(N'Khóa học đã hết chỗ!', 16, 1);
END
-- 2. Thêm hóa đơn mới
INSERT INTO HoaDon (MaHV, MaKH, NgayTao)
VALUES ('HV09', 'SQL-ADV', GETDATE());
-- 3. Xác nhận thành công
COMMIT TRANSACTION;
PRINT N'Đăng ký khóa học thành công!';
END TRY
BEGIN CATCH
-- Khôi phục dữ liệu nếu thất bại
ROLLBACK TRANSACTION;
PRINT N'Đăng ký thất bại: ' + ERROR_MESSAGE();
END CATCH;
Tác giả: Huỳnh Trung Hậu
📞 Hotline: 0939.866.825 (Mr. Minh Khang)
🌐 Website: MCNA Technology School
📍 Hà Nội: 30 Trung Liệt, Đống Đa | Liền kề 44B TT2 Văn Quán, Hà Đông
📍 TP.HCM: 50B Phan Tây Hồ, Cầu Kiệu

