Thứ Tư, 25 tháng 2, 2026

MODULE 10: QUẢN TRỊ GIAO DỊCH ĐỒNG THỜI VÀ TỐI ƯU CSDL LỚN

1. Tổng quan

Kiểm soát đồng thời (Concurrency Control) là cách DBMS ngăn chặn các User giẫm chân lên nhau khi cùng sửa một dòng dữ liệu.

Với Oracle, nhờ kiến trúc lưu thông tin khóa (Lock) ngay trên Data Block vật lý, nó có thể xử lý hàng triệu giao dịch mà không tốn thêm RAM quản lý khóa. Tuy nhiên, ở các hệ thống khác, Lock được quản lý trên một vùng nhớ tập trung (Lock Manager). Khi RAM cạn kiệt, chúng sẽ tự động leo thang từ khóa dòng (Row Lock) lên khóa cả bảng (Table Lock), gây ra thảm họa hiệu năng.

2. Chi tiết các nội dung

A. Triết lý Locking và Cạm bẫy "Leo thang khóa" (Lock Escalation)

Hệ thốngMức độ Khóa (Granularity)Hiện tượng Lock Escalation (Leo thang khóa)Cạm bẫy nguy hiểm cho DBA khi tối ưu DB lớn
OracleRow-level (Khóa trên block)KHÔNG BAO GIỜ. 1 triệu dòng bị khóa cũng chỉ tốn từng đó byte trên block.Gần như không có, Oracle sinh ra để xử lý concurrency khổng lồ.
SQL ServerRow $\rightarrow$ Page $\rightarrow$ TableCÓ. Khi 1 lệnh chạm ngưỡng khoảng 5.000 row locks, hệ thống tự gộp thành 1 Table Lock.Một lệnh UPDATE lớn ban đêm có thể khóa cứng toàn bảng, làm treo mọi giao dịch khác.
PostgreSQLRow-level (Ghi vào dead tuple)KHÔNG đối với Row lock.Các lệnh DDL (như ALTER TABLE) sinh ra Access Exclusive Lock, chặn sạch mọi thao tác đọc/ghi.
MySQLRow-level (Gắn vào Index)KHÔNG theo nghĩa truyền thống, nhưng Transaction size bị giới hạn RAM.Cạm bẫy tử thần: Nếu lệnh UPDATE không dùng Index, InnoDB sẽ khóa TOÀN BỘ BẢNG!
MongoDBDocument-level (WiredTiger)KHÔNG. Dùng Intent Lock trên Database/Collection.Giao dịch (Transaction) quá dài trên nhiều Document sẽ làm nghẽn WiredTiger cache.

B. Deadlock (Khóa chết) và Cách xử lý

Tất cả các hệ thống đều xử lý Deadlock theo cùng một cách: Tiến trình ngầm sẽ phát hiện, chọn ra 1 session làm "Nạn nhân" (Victim) và KILL (Rollback) nó để giải phóng cho session kia chạy tiếp.

Nguyên lý tối ưu: Deadlock không phải là lỗi của CSDL, mà là lỗi thiết kế ứng dụng. Cách duy nhất để chống Deadlock là ép ứng dụng luôn cập nhật các bảng theo cùng một thứ tự.

C. Câu lệnh Quản trị & Kết quả đầu ra (Truy tìm Kẻ gây tắc nghẽn - Blocker)

Khi hệ thống báo chậm, việc đầu tiên của anh là tìm xem session nào đang "ôm" khóa và chặn các session khác.

1. Oracle: Xem session nào đang bị chặn và ai là kẻ chặn (Dùng v$session).

SQL
SELECT sid AS victim_sid, serial#, blocking_session AS blocker_sid, event, seconds_in_wait 
FROM v$session 
WHERE blocking_session IS NOT NULL;
-- Kết quả: Liệt kê các SID đang bị treo và SID của kẻ gây nghẽn để anh dùng 'ALTER SYSTEM KILL SESSION' xử lý.

2. SQL Server: Tìm Blocker qua DMV sys.dm_exec_requests.

SQL
SELECT session_id AS 'Victim', blocking_session_id AS 'Blocker', wait_type, wait_time 
FROM sys.dm_exec_requests
WHERE blocking_session_id <> 0;
-- Kết quả: Victim: 60 | Blocker: 54 | LCK_M_X | 15000 ms.

3. PostgreSQL: Truy tìm Blocking qua pg_lockspg_stat_activity.

SQL
SELECT blocked_locks.pid AS victim_pid, blocking_locks.pid AS blocker_pid, blocked_activity.query
FROM pg_catalog.pg_locks blocked_locks
JOIN pg_catalog.pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid
JOIN pg_catalog.pg_locks blocking_locks ON blocking_locks.locktype = blocked_locks.locktype 
     AND blocked_locks.pid != blocking_locks.pid AND blocked_locks.granted = false AND blocking_locks.granted = true;
-- Kết quả: Liệt kê Victim PID và Blocker PID khóa nhau trên cùng một object.

4. MySQL / MariaDB: Xem transaction đang giữ khóa.

SQL
SELECT waiting_pid AS victim_pid, blocking_pid AS blocker_pid 
FROM sys.innodb_lock_waits;
-- Kết quả: Liệt kê trực tiếp ID của kết nối đang chờ và kết nối đang chặn.

5. MongoDB: Kiểm tra các operation đang chạy quá lâu (> 3 giây) gây nghẽn.

JavaScript
db.currentOp({
  "active" : true,
  "secs_running" : { "$gt" : 3 }
})
// Kết quả: Trả về JSON chứa 'opid' của thao tác đang chạy lâu. Dùng db.killOp() để hủy.

3. Tóm tắt lại nội dung của bài học

Để tối ưu hệ thống có hàng ngàn kết nối đồng thời, anh cần nhớ nguyên tắc sinh tồn của từng CSDL:

  • Oracle: Là "Vua" đồng thời nhờ lưu Lock vật lý trên Block. Anh không bao giờ phải lo lắng việc Update hàng triệu dòng sẽ làm treo toàn bảng.

  • SQL Server: Cực kỳ nhạy cảm với Lock Escalation. Để tối ưu, anh bắt buộc phải chia nhỏ các câu lệnh UPDATE/DELETE lớn thành các Batch nhỏ (vd: 2.000 dòng/lần) để hệ thống không tự động chuyển thành Table Lock.

  • PostgreSQL: MVCC giúp đọc/ghi rất mượt, nhưng rủi ro nằm ở các lệnh DDL. Khi tối ưu, hãy luôn dùng từ khóa CONCURRENTLY (vd: CREATE INDEX CONCURRENTLY) để tạo chỉ mục mà không làm gián đoạn ứng dụng.

  • MySQL: Cạm bẫy Table Lock ẩn nấp trong mọi câu lệnh UPDATE/DELETE. Anh phải luôn đảm bảo điều kiện WHERE đánh trúng vào một Index đã có, nếu không InnoDB sẽ quét và khóa sạch toàn bảng.

  • MongoDB: Mặc dù hỗ trợ Transaction từ bản 4.0, nhưng thiết kế NoSQL không sinh ra để chạy các Transaction kéo dài qua nhiều Document. Hãy dùng các toán tử nguyên tử (như $inc, $set) để cập nhật in-memory cực nhanh.


4. Câu hỏi ôn tập

  1. Hỏi (Oracle): Tham số nào quyết định thời gian (tính bằng giây) mà Oracle cố gắng giữ lại dữ liệu cũ trong Undo Tablespace để phục vụ các câu lệnh SELECT chạy lâu?

    • Đáp: UNDO_RETENTION.

  2. Hỏi (SQL Server): Nếu ứng dụng phàn nàn rằng câu lệnh SELECT bị treo cứng (blocking) do một ai đó đang chạy lệnh UPDATE trên cùng một bảng, anh cần bật tính năng gì cấp Database để khắc phục?

    • Đáp: Bật tính năng RCSI (Read Committed Snapshot Isolation).

  3. Hỏi (PostgreSQL): PostgreSQL không có Undo Tablespace, vậy ảnh cũ của một dòng dữ liệu (Before-Image) nằm ở đâu sau khi bị UPDATE?

    • Đáp: Nằm ngay tại Data Page cũ (cùng chỗ với dữ liệu hiện tại), được gọi là một "Dead Tuple" cho đến khi tiến trình VACUUM dọn dẹp nó.

  4. Hỏi (MySQL): Nếu một lập trình viên mở một giao dịch (BEGIN) nhưng quên không COMMIT hoặc ROLLBACK và bỏ đi uống cà phê, hệ lụy gì sẽ xảy ra với không gian Undo?

    • Đáp: Tiến trình Purge Thread không thể dọn dẹp các Undo log cũ, khiến Undo Tablespace phình to liên tục và suy giảm hiệu năng.

  5. Hỏi (SQL Server 2019+): Tính năng mới nào của Microsoft giúp giải phóng gánh nặng Undo cho tempdb và giúp Rollback cực nhanh (Instant Rollback) bất kể giao dịch dài đến đâu?

    • Đáp: Accelerated Database Recovery (ADR) - lưu Version Store ngay trong chính User Database thay vì tempdb.


5. Bài tập thực hành (Cấu hình MVCC / Undo)

Đề bài: Là một DBA, anh được giao nhiệm vụ kiểm tra và cấu hình cơ chế lưu giữ phiên bản (MVCC/Undo) để đảm bảo các câu lệnh báo cáo (SELECT) không bị chặn bởi các lệnh UPDATE. Hãy viết câu lệnh thao tác cho 4 hệ thống (MongoDB xử lý in-memory tự động nên bỏ qua).

Đáp án:

1. Oracle: Xem và cấu hình thời gian giữ Undo lên 2 tiếng (7200 giây)

SQL
SHOW PARAMETER undo_retention;
ALTER SYSTEM SET undo_retention = 7200 SCOPE=BOTH;

2. SQL Server: Bật tính năng RCSI cho Database sopirs_new để hành xử giống Oracle (Đọc không chặn Ghi)

SQL
-- Lưu ý: Phải ngắt các kết nối khác trước khi chạy lệnh này
ALTER DATABASE sopirs_new SET READ_COMMITTED_SNAPSHOT ON;
-- Kiểm tra lại:
SELECT name, is_read_committed_snapshot_on FROM sys.databases WHERE name = 'sopirs_new';

3. PostgreSQL: Mặc định Postgres đã là MVCC. Anh chỉ cần kiểm tra xem tiến trình tự động dọn rác (Autovacuum) có đang chạy không.

SQL
SHOW autovacuum; 
-- Kết quả chuẩn phải là 'on'

4. MySQL / MariaDB: Xem lịch sử Undo log đã được dọn dẹp (Purge) đến đâu.

SQL
-- Xem thông tin chi tiết của Engine InnoDB, phần TRANSACTIONS sẽ báo History list length
SHOW ENGINE INNODB STATUS;
=============================
TƯ VẤN: Click Here hoặc Hotline/Zalo 090.29.12.888
=============================
Website không chứa bất kỳ quảng cáo nào, mọi đóng góp để duy trì phát triển cho website (donation) xin vui lòng gửi về STK 90.2142.8888 - Ngân hàng Vietcombank Thăng Long - TRAN VAN BINH
=============================
Nếu bạn không muốn bị AI thay thế và tiết kiệm 3-5 NĂM trên con đường trở thành DBA chuyên nghiệp hay làm chủ Database thì hãy đăng ký ngay KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE, được Coaching trực tiếp từ tôi với toàn bộ bí kíp thực chiến, thủ tục, quy trình của gần 20 năm kinh nghiệm (mà bạn sẽ KHÔNG THỂ tìm kiếm trên Internet/Google) từ đó giúp bạn dễ dàng quản trị mọi hệ thống Core tại Việt Nam và trên thế giới, đỗ OCP.
- CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
- Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
2 khóa học online qua video giúp bạn nhanh chóng có những kiến thức nền tảng về Linux, Oracle, học mọi nơi, chỉ cần có Internet/4G:
- Oracle cơ bản: https://bit.ly/admin_1200
- Linux: https://bit.ly/linux_1200
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile/Zalo: 0902912888
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: https://www.youtube.com/@binhguru
👨 Tiktok: https://www.tiktok.com/@binhguru
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhguru
👨 Podcast: https://www.podbean.com/pu/pbblog-eskre-5f82d6
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội

=============================
cơ sở dữ liệu, cơ sở dữ liệu quốc gia, database, AI, trí tuệ nhân tạo, artificial intelligence, machine learning, deep learning, LLM, ChatGPT, DeepSeek, Grok, oracle tutorial, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,sql tutorial, khóa học pl/sql tutorial, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c/21c/23c/23ai, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail,oracle RAC, ASM, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, postgresql tutorial, mysql tutorial, mariadb tutorial, ms sql server tutorial, nosql, mongodb tutorial, oci, cloud, middleware tutorial, docker, k8s, micro service, hoc solaris tutorial, hoc linux tutorial, hoc aix tutorial, unix tutorial, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master