Thứ Năm, 26 tháng 6, 2025
Điều khiển truy xuất đồng thời - phần 1
Đăng bởi

Mục lục:
- Transaction
- ACID
- Schedule
- Các vấn đề của truy xuất đồng thời
- Mất dữ liệu cập nhật (lost update)
- Đọc dữ liệu rác (dirty read)
- Không thể đọc lại (unrepeatable read)
- Bóng ma (phantom read)
- Các kỹ thuật giải quyết vấn đề truy xuất đồng thời
- Kỹ thuật khóa
- Quy tắc về transaction đúng
- Quy tắc về schedule hợp lệ
- Nghi thức khóa hai giai đoạn (two-phases locking)
Transaction
Nhắc lại một xíu về transaction, là một hoặc nhiều các thao tác SQL tương tác với dữ liệu bao gồm đọc và ghi.
Các hành động của một transaction
- Input: lấy data từ db đưa vào buffer.
- Read: lấy data từ buffer vào Transaction.
- Write: ghi data từ Transaction vào buffer.
- Output: ghi data từ buffer vào db.
ACID
ACID là bốn tính chất của một transaction, tượng trưng cho:
- Atomicity: Tất cả câu lệnh phải được thực hiện từ đầu tới cuối không sót câu nào, có 1 câu lệnh không thành công thì rollback mọi thứ đã thực hiện trước đó.
- Consistency: Transaction phải đưa cơ sở dữ liệu (CSDL) từ trạng thái nhất quán này đến trạng thái nhất quán khác, không vi phạm các ràng buộc toàn vẹn.
- Isolation: Transaction phải cô lập và không được dính líu tới các transaction khác diễn ra đồng thời.
- Durability: Dữ liệu đã cập nhật bởi transaction đã kết thúc phải được lưu trữ bền bỉ xuống ổ cứng bất chấp sự cố gì xảy ra.
Schedule
Là một tập hợp của nhiều transaction trên một thời gian cụ thể trong cùng một CSDL.
Có hai loại lịch:
- Lịch tuần tự: đúng nhưng chậm
- Lịch đồng thời: nhanh nhưng có thể sai.
Các vấn đề của truy xuất đồng thời
Mở bài hơi dài, nhưng tôi thích thế. Phần này sẽ lý giải vì sao lịch đồng thời dễ sai như vừa nhắc ở trên.
- Quy ước dùng cho các ví dụ sau:
- R(A, x): đọc dữ liệu trong tập A và cho vào biến x
- W(A, x): ghi dữ liệu của x vào tập A
1. Mất dữ liệu cập nhật (lost update)
T1 | T2 |
---|---|
R(A, x) | |
R(A, x) | |
x = x * 2 | |
x = x * 3 | |
W(A, x) | |
W(A, x) |
Có thể thấy, cả hai transaction đều đọc A, update A và ghi A vào CSDL. Nếu x ban đầu là 1 thì kết quả cuối cùng sẽ là 3 thay vì 6.
2. Đọc dữ liệu rác (dirty read)
T1 | T2 |
---|---|
R(A, t) | |
... | |
R(A, x) | |
... | |
Rollback |
3. Không thể đọc lại (unrepeatable read)
T1 | T2 |
---|---|
R(A) | |
... | ... |
... | W(A) |
... | ... |
⚠️ R(A) |
- Ở T1 không thay đổi gì nhưng giá trị của nó lại bị thay đổi.
- Tại trước thời điểm 3, lịch T1 đang sử dụng giá trị đúng nhưng từ thời điểm 3 trở đi T1 đang sử dụng giá trị đã lỗi thời.
- Tuy nhiên, không có chuyện T1 đọc A hai lần trong một transaction trong thực tế.
4. Bóng ma (phantom read)
T1 | T2 |
---|---|
R(A = {A1, ..., An}) | |
... | ... |
... | Ins/Del Ai ∈ Alpha |
... | ... |
- Tương tự unrepeatable read nhưng nó chỉ thay đổi số lượng phần tử mà không thay đổi giá trị. Dẫn đến việc khi tính trung bình, việc thay đổi số lượng phần tử này sẽ làm sai lệch giá trị của T1.
Các kỹ thuật giải quyết vấn đề truy xuất đồng thời
Bao gồm các kỹ thuật như: Kỹ thuật khóa, nhãn thời gian, kiểm tra hợp lệ
Kỹ thuật khóa
Có nhiều kỹ thuật khóa như khóa đơn giản, khóa đa hạt, khóa đọc ghi, nhưng trong bài viết này mình chỉ tìm hiểu khóa đọc ghi (vì ở đại học tôi học được mỗi cái đấy 😒)
Quy tắc về transaction đúng
Một transaction T được gọi là giao tác đúng đắn nếu như:
- Trước khi T đọc vào A thì T phải gắn khóa đọc vào A ⇒ Ngăn chặn hành động các giao tác khác gây xung đột với việc đọc.
R(A) => Rl(A) (read lock A)
- Nếu giao tác T muốn ghi vào A thì phải gắn khóa ghi lên A ⇒ Bảo vệ dữ liệu chúng ta đang ghi và ngăn chặn các hành động gây xung đột chuyện ghi
W(A) => Wl(A) (write lock A)
- Sau khi dùng A xong (khác với truy xuất, hay nói cách khác là hoàn thành một transaction) phải tháo khóa khỏi A để nhường lại quyền truy cập cho các giao tác khác.
u(A) or un(A) (unlock A)
Quy tắc về schedule hợp lệ
Một lịch S được gọi là hợp lệ khi và chỉ khi nó tuân thủ ma trận tương thích (Compatitbility Matrix)
Xem theo chiều cột → dòng. Dữ liệu đang có khóa [cột], khóa [dòng] xin gắn vào thì có cho không?
Rl | Wl | ul | |
---|---|---|---|
Rl | ✅ | ❌ | ❌ |
Wl | ❌ | ❌ | ❌ |
ul | ✅ | ❌ | ❌ |
- Rl: Read lock
- Wl: Write lock
- ul: Unlock
Nghi thức khóa hai giai đoạn (two-phases locking)
- Một khi transaction đã unlock bất kể là unlock dữ liệu nào thì giao tác sẽ không được lock nữa, bất kể là lock trên dữ liệu nào.
- Bộ lập lịch của hệ quản trị cơ sở dữ liệu (HQTCSDL) chia ra 2 phases rõ rệt
- Phase 1: Chỉ gồm các lock
- Phase 2: Chỉ gồm các unlock
Nếu một lịch S thỏa cả 3 quy tắc trên thì lịch S khả tuần tự xung đột.
Note:
Qua bài viết này ta đã hiểu được cơ chế khóa và các vấn đề của truy xuất đồng thời. Bài viết sau chúng ta sẽ bàn về Transaction Isolation Level