Professional Documents
Culture Documents
Ôn Tập Lịch Khả Tuần Tự Xung Đột
Ôn Tập Lịch Khả Tuần Tự Xung Đột
Nếu 2 hành động đọc của 2 giao tác xử lý trên cùng một đơn vị dữ liệu thì không
xảy ra xung đột vì chỉ xem dữ liệu chứ không có thay đổi dữ liệu.
Tóm lại, hai hành động của 2 giao tác khác nhau xảy ra xung đột khi:
- 2 hành động đó phải xử lý trên cùng một đơn vị dữ liệu.
- Trong 2 hành động đó phải có ít nhất một hành động ghi. Chúng ta có 3 tình huống
xung đột như sau:
+ Read1(A); Write2(A) => Có nghĩa là giao tác 1 đọc xong thì giao tác 2 ghi trên cùng
đơn vị dữ liệu A.
+ Write2(A); Read1(A) => Có nghĩa là giao tác 2 ghi xong thì giao tác 1 đọc trên cùng
đơn vị dữ liệu A.
+ Write1(A); Write2(A) hoặc Write2(A); Write1(A) => hai giao tác cùng ghi trên cùng
đơn vị dữ liệu A.
(Việc cô lập (hay khóa) đơn vị dữ liệu chúng ta sẽ được học ở những bài sau, và việc cô lập
này cho phép đến mức độ nào thì tùy vào Hệ QTCSDL, khi đến bài học đó chúng ta sẽ tìm
hiểu cụ thể trên SQL SERVER.)
Chúng ta nhận thấy, sau khi S3 thực hiện xong thí A=250 và B=150, điều này không đảm bảo
tính nhất quán dữ liệu (A=B) => Lịch S3 không khả tuần tự với lịch S1 hoặc S2.
Chúng ta tiếp tục xây dựng lịch xử lý đồng thời S4 như sau:
Chúng ta nhận thấy sau khi S4 thực hiện xong thì A=B=250 thỏa ràng buộc tính nhất quán dữ
liệu tương ứng với lịch tuần tự S1. Ta nói S4 khả tuần tự với S1, có nghĩa là S4 có khả năng
thực hiện giống lịch tuần tự S1.
Đến đây nhiều bạn có một thắc mắc như sau: Trong lịch tuần tự S1, T1 thực hiện trước với
6 lệnh (6 hành động), sau đó T2 thực hiện với 6 lệnh , vậy lịch S1 thực hiện 12 lệnh. Trong
khi đó, lịch đồng thời (khả tuần tự) S4 trước tiên 3 lệnh của T1 thực hiện, kế tiếp 3 lệnh của
T2, tiếp theo 3 lệnh của T1 và sau cùng là 3 lệnh của T2 thực hiện, vậy lịch S4 cũng thực hiện
12 lệnh. Như vậy, thời gian thực hiện của S1 và S4 có gì khác nhau đâu mà xây dựng lịch
S4 làm chi cho tốn thời gian và còn kiểm tra S4 có khả tuần tự hay không nữa?
Đây là thắc mắc rất hay và hợp lý. Lý do tại sao cần xây dựng S4 như sau:
Giả sử 3 lệnh đầu của T1 vừa thực hiện xong, khi đó các lệnh tiếp theo của T1 cần xử lý
đơn vị dữ liệu B, nhưng B đang bị khóa bởi giao tác Tx nào đó, vậy T1 phải chờ cho Tx giải
phóng B thì T1 mới xử lý được. Nếu lịch S1 thì phải chờ cho Tx giải phóng B mới làm tiếp,
trong khi đó lịch S4 chen ngang vào 3 lệnh của T2 để xử lý A trước, sau đó trả điều khiển
về cho T1 xử lý B. Như vậy S4 tiết kiệm thời gian thực hiện hơn S1.
Đây là một lý do nho nhỏ thôi, còn nhiều lý do khác nữa như có lệnh trong giao tác thì xử
lý trên máy user, có lệnh thì xử lý trên server, khi lệnh của T1 xử lý trên máy user thì trên
server có thể xử lý lệnh của giao tác khác, ngoài ra một số server có nhiều con CPU có thể
xử lý đồng thời nữa, mỗi CPU xử lý một lệnh riêng. Vì vậy, phần mềm Hệ QT CSDL phải
có cơ chế hỗ trợ xử lý đồng thời và người lập trình phải viết các transaction như thế nào để
tối ưu được các lịch giao tác.
Trong phần này, chúng ta dùng thuật toán thực hiện qua các bước để kiểm tra một lịch giao tác
cho trước có khả tuần tự xung đột hay không? (Lịch khả tuần tự view chúng ta sẽ ôn tập sau).
Thuật toán này hướng dẫn chúng ta xây dựng đồ thị có hướng cho các giao tác, khi xây dựng
xong đồ thị thì xảy ra 2 trường hợp sau:
- Nếu đồ thị không có chu trình thì lịch giao tác đã cho khả tuần tự xung đột. Khi
đó thứ tự các đỉnh trong đồ thị là thứ tự thực hiện giao tác tương đương với lịch tuần
tự tương ứng.
- Nếu đồ thị có chu trình thì lịch giao tác đã cho không khả tuần tự xung đột.
Để xây dựng được đồ thị này, chúng ta phải xác định được các đỉnh và các cung, các bước
thực hiện của thuật toán như sau:
- Bước 1: Biểu diễn lịch giao tác theo cách 2
- Bước 2: Xác định các đỉnh của đồ thi. Đỉnh của đồ thị chính là các giao tác trong lịch
giao tác đang kiểm tra.
- Bước 3: Xác định các cung từ đỉnh này sang đỉnh khác của đồ thị. Đây là bước quan
trọng và phức tạp, chúng ta theo dõi thật kỹ nhé.
Chúng ta vẽ được cung từ đỉnh i sang đỉnh j khi điều này xảy ra Ti <S Tj
Vậy Ti <S Tj là gỉ? Cái này có nghĩa là:
+ Một lệnh trên giao tác Ti thực hiện trước một lệnh trên giao tác Tj (chú ý: hai lệnh
này liên tiếp hoặc không liên tiếp đều được) và 2 lệnh này phải xảy ra xung đột.
+ Hai lệnh của 2 giao tác khác nhau xảy ra xung đột khi nào? Việc này chúng ta đã tìm
hiểu cuối phần 1 (Đơn vị dữ liệu) rồi. Nhắc lại 2 hành động xung đột khi:
Hai hành động đó phải xử lý trên cùng một đơn vị dữ liệu.
Trong hai hành động đó phải có ít nhất một hành động ghi.
Bước 3: Xác định các cung cho từng cặp đỉnh như sau:
- Từ đỉnh 1 đến đỉnh 2 có cung không?
Chúng ta tìm xem có hai hành động nào trong T1 và T2 xảy ra xung đột như 3 tình huống trong
bài học ở trên không, chúng ta chú ý hành động trong T1 thực hiện trước hành động trong T2
nhe vì chúng ta đang cần vẽ cung từ 1 sang 2.
Chúng ta thấy có tới 3 tình huống xảy ra xung đột như sau:
Thật ra, chỉ cần một tình huống là đủ để vẽ cung rồi. Vậy ta vẽ cung từ đỉnh 1 sang đỉnh 2.
Chúng ta cũng chỉ cần một tình huống là đủ để vẽ cung rồi. Vậy ta vẽ được cung từ đỉnh 2
sang đỉnh 3 như sau:
Nhìn vào đồ thị trên, chúng ta thầy rằng đồ thị không có chu trình => Lịch S10 khả tuần tự
xung đột. Dựa vào thứ tự hình học các đỉnh trong đồ thị, chúng ta có lịch giao tác tuần tự
S với thứ tự các giao tác thực hiện là T1; T2; T3 tương đương với lịch S10, điều này có
nghĩa là S và S10 khi thực hiện thì đảm bảo tính nhất quán dữ liệu giống nhau. Nếu chúng
ta thực hiện lịch tuần tự S thì không sợ xung đột dữ liệu nhưng tốn thời gian và không tận dụng
chia xẻ tài nguyên; trong khi đó nếu chúng ta thực hiện lịch đồng thới S10 (lịch xử lý đồng
thời khả tuần tự xung đột và tương đương với S) thì tận dụng được vấn đề chia xẻ tài nguyên,
tiết kiệm thời gian, ….
Bước 2: Xác định các đỉnh của đồ thị. Lịch S11 có 3 giao tác, vì vậy có 3 đỉnh như sau:
Bước 3: Xác định các cung cho từng cặp đỉnh như sau:
- Từ đỉnh 1 đến đỉnh 2 có cung không?
Chúng ta thấy có tới 2 tình huống xảy ra xung đột như sau. Chúng ta nhớ vì từ 1 sang 2, nên
hành động bên T1 phải thực hiện trước, hành động bên T2 thực hiện sau trên cùng một đơn vị
dữ liệu.
Thật ra, chỉ cần một tình huống là đủ để vẽ cung rồi. Vậy ta vẽ cung từ đỉnh 1 sang đỉnh 2.
Chúng ta cũng chỉ cần một tình huống là đủ để vẽ cung rồi Vậy ta vẽ được cung từ đỉnh 2 sang
đỉnh 3 như sau:
Nhìn vào đồ thị trên, chúng ta thầy rằng đồ thị có chu trình (chu trình từ 2 sang 1 và từ 1
sang 2) => Lịch S11 không khả tuần tự xung đột.