Làm việc với giao dịch

“Giao dịch (Transaction)” là một phần quan trọng trong quản trị cơ sở dữ liệu, đặc biệt khi bạn làm việc với các nghiệp vụ cần đảm bảo tính toàn vẹn dữ liệu (consistency) như trong database quản trị ADMIN_DB.

🧩 1. Khái niệm giao dịch trong MySQL

🔹 Định nghĩa:

Giao dịch (Transaction)một nhóm các thao tác SQL (INSERT, UPDATE, DELETE, v.v.) được coi là một đơn vị logic duy nhất.
Tất cả các thao tác trong giao dịch hoặc cùng thành công, hoặc cùng thất bại — không có trạng thái trung gian.

🔹 Tính chất của giao dịch — ACID

Thuộc tính Ý nghĩa
A — Atomicity Tính nguyên tử: tất cả câu lệnh trong giao dịch được thực thi trọn vẹn hoặc không thực thi gì cả.
C — Consistency Dữ liệu luôn trong trạng thái hợp lệ trước và sau khi giao dịch.
I — Isolation Các giao dịch độc lập, không làm ảnh hưởng đến nhau khi chạy song song.
D — Durability Kết quả giao dịch đã COMMIT được lưu vĩnh viễn trong hệ thống.

⚙️ 2. Cú pháp cơ bản trong MySQL

START TRANSACTION;  -- hoặc BEGIN;
-- Các câu lệnh SQL cần thực hiện
...
COMMIT;             -- Xác nhận (lưu) giao dịch
-- hoặc:
ROLLBACK;           -- Hủy toàn bộ thay đổi trong giao dịch

💡 Lưu ý:

  • Chỉ những bảng sử dụng InnoDB mới hỗ trợ giao dịch.
  • Trong MySQL, mặc định autocommit = 1 → mỗi câu lệnh được tự động commit.
    Để dùng giao dịch, bạn có thể tạm tắt:

    SET autocommit = 0;
    

🧱 3. Ví dụ thực hành trong CSDL quản trị ADMIN_DB

🎯 Bài toán:

Giả sử khi thêm mới một bản ghi sao lưu (backup), ta cần đồng thời:

  • Ghi log vào bảng backup_log
  • Cập nhật thời gian last_sync cho database tương ứng trong tbl_databases

Nếu một trong hai bước thất bại, toàn bộ phải rollback để tránh sai lệch dữ liệu.

✅ Cụ thể:

USE ADMIN_DB;

START TRANSACTION;

-- 1️⃣ Ghi log backup
INSERT INTO backup_log (db_name, backup_type, file_path, backup_size_mb, duration_sec, status)
VALUES ('sales_db', 'FULL', 'D:/backup/sales_db_full_2025-10-22.bak', 512.50, 120, 'SUCCESS');

-- 2️⃣ Cập nhật thời gian đồng bộ
UPDATE tbl_databases
SET last_sync = NOW()
WHERE db_name = 'sales_db';

-- Kiểm tra dữ liệu có lỗi không
-- Nếu mọi thứ OK:
COMMIT;

-- Nếu có lỗi:
-- ROLLBACK;

📋 Giải thích:

  • START TRANSACTION: bắt đầu một phiên giao dịch.
  • Nếu INSERT hoặc UPDATE lỗi (ví dụ database không tồn tại), ta gọi ROLLBACK.
  • Nếu cả hai thành công → COMMIT → dữ liệu được lưu vĩnh viễn.

🧠 4. Ứng dụng thực tế trong quản trị ADMIN_DB

Tình huống quản trị Ứng dụng giao dịch
Sao lưu & cập nhật trạng thái hệ thống Đảm bảo log và trạng thái đồng bộ.
Gán quyền cho user Thêm bản ghi vào user_privileges đồng thời ghi user_audit_log.
Cập nhật dung lượng dữ liệu Cập nhật bảng space_usagegrowth_history cùng lúc.
Quản lý job tự động Nếu job thất bại, rollback trạng thái trong job_definition.

💡 5. Ví dụ nâng cao — Quản lý quyền người dùng (SECURITY)

USE ADMIN_DB;

START TRANSACTION;

-- 1️⃣ Cấp quyền cho người dùng
INSERT INTO user_privileges (user_id, db_name, privilege_type, is_grantable)
VALUES ('dba_01', 'sales_db', 'SELECT', 'YES');

-- 2️⃣ Ghi log hành động cấp quyền
INSERT INTO user_audit_log (user, host, action, object_name)
VALUES ('admin', 'localhost', 'GRANT SELECT', 'sales_db');

-- 3️⃣ Kiểm tra kết quả
-- Nếu tất cả OK:
COMMIT;
-- Nếu phát hiện lỗi:
-- ROLLBACK;

📌 Mục tiêu: tránh tình huống quyền đã được cấp mà không có log tương ứng.

🧾 6. Kiểm tra trạng thái giao dịch

Bạn có thể kiểm tra trạng thái hiện tại bằng:

SELECT @@autocommit;

Hoặc bật/tắt tự động commit:

SET autocommit = 0;  -- tắt autocommit để chủ động dùng COMMIT/ROLLBACK
SET autocommit = 1;  -- bật lại mặc định

📘 Tóm tắt cho tài liệu hướng dẫn

Thành phần Nội dung
Khái niệm Nhóm lệnh SQL được thực hiện như 1 đơn vị logic, đảm bảo ACID.
Cú pháp chính START TRANSACTION; ... COMMIT; hoặc ROLLBACK;
Ứng dụng trong ADMIN_DB Backup log, user privilege, job automation, capacity tracking
Lưu ý kỹ thuật Dùng InnoDB, tắt autocommit khi cần, rollback nếu lỗi

 

 

 

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *