Download as pdf or txt
Download as pdf or txt
You are on page 1of 13

ÔN TẬP LỊCH KHẢ TUẦN TỰ XUNG ĐỘT

1. ĐƠN VỊ DỮ LIỆU LÀ GÌ?


- Một CSDL thì bao gồm nhiều Table. Mỗi Table bao gồm nhiều cột gọi là thuộc tính và nhiều
dòng gọi là mẫu tin.
- Đơn vị dữ liệu có thể là:
+ Một CSDL
+ Một hoặc nhiều Table
+ Một hoặc nhiều cột trong Table
+ Một hoặc nhiều dòng trong Table
+…
- Xác định Đơn vị dữ liệu do người lập trình đặt ra nhằm mục đích cho hành động đọc dữ liệu,
ghi dữ liệu hay để khóa dữ liệu (khóa dữ liệu còn gọi là cô lập dữ liệu).
- Hành động đọc (Read) dữ liệu mục đích là lấy dữ liệu ra xem, đó chính là câu truy vấn Select.
- Hành động ghi (Write) dữ liệu mục đích là làm thay đỏi dữ liệu, đó chính là các câu truy vấn
Insert, Update hoặc Delete.
Ví dụ 1:
Select Hoten from Sinhvien
Trong câu truy vấn trên, chúng ta có thể định nghĩa đơn vị dữ liệu là cột Hoten trong Table
Sinhvien. Đây là hành động đọc và đơn vị dữ liệu là một cột trong table.
Ví dụ 2:
Update Taikhoan set sodu = sodu + 100000 where matk=1
Trong câu truy vấn trên, chúng ta có thể định nghĩa đơn vị dữ liệu là dòng dữ liệu có matk=1
trong Table Taikhoan. Đây là hành động ghi và đơn vị dữ liệu là một dòng trong table.
Ví dụ 3:
Select * from Sinhvien
Hoặc
Update Taikhoan set sodu = sodu + 100000
Trong 2 câu truy vấn trên, chúng ta có thể định nghĩa đơn vị dữ liệu là một table Sinhvien hay
tableTaikhoan.
Tại sao chúng ta cần hiểu đơn vị dữ liệu để làm gỉ???
Chúng ta xem lại ví dụ 2, trong truy vấn đó chúng ta cần cập nhật số dư của matk=1, vậy những
tài khoản khác không bị ảnh hưởng. Vậy khi đó giao tác của chúng ta chỉ cần cô lập (hay khóa)
dòng dữ liệu có matk=1, còn những dòng dữ liệu khác thì cho các giao tác khác xử lý thoải
mái mà không xảy ra xung đột gì cả, điều này giúp cho việc xử lý đồng thời nhanh hơn.
Nếu chúng ta xác định đơn vị dữ liệu là table Taikhoan, khi đó chúng ta cô lập (hay khóa) toàn
bộ các dòng dữ liệu trong table Taikhoan, các giao tác khác muốn xử lý những dòng dữ liệu
có matk1 cũng không được, đến khi hành động ghi của giao tác xử lý xong thì mới làm việc
được, điều này làm tăng thời giàn xử lý vì các giao tác phải chờ giao tác đang xử lý “mở khóa”
cho table Taikhoan.
Hiểu được đơn vị dữ liệu để chúng ta hiểu được vấn đề xung đột trong các hành động
đọc, ghi của các giao tác và việc cô lập (khóa) chúng.
Tiếp theo, chúng ta hãy xem ví dụ sau:
Cho giao tác T1 có hành động ghi như sau:
Update Taikhoan set sodu = sodu + 100000 where matk=1
Cho giao tác T2 có hành động ghi như sau:
Update Taikhoan set sodu = sodu + 100000 where matk=5
Hành động ghi trong giao tác T1 liên quan dến đơn vị dữ liệu là dòng dòng dữ liệu có matk=1;
trong khi đó hành động ghi trong giao tác T2 liên quan dến đơn vị dữ liệu là dòng dữ liệu có
matk=5.
 Hai hành động ghi của 2 giao tác này xử lý trên 2 đơn vị dữ liệu khác nhau nên không
ảnh hưởng gì hết, do đó không xảy ra xung đột. (Giao tác T1 có đơn vị dữ liệu là dòng
dữ liệu có matk=1; trong khi đó giao tác T2 có đơn vị dữ liệu là dòng dữ liệu có matk=5).
Một ví dụ khác:
Cho giao tác T1 có hành động ghi như sau:
Update Taikhoan set sodu = sodu + 100000 where matk=1
Cho giao tác T2 có hành động đọc như sau:
Select sodu from Taikhoan where matk=1
Hành động ghi trong giao tác T1 liên quan dến đơn vị dữ liệu là dòng dòng dữ liệu có matk=1;
trong khi đó hành động đọc trong giao tác T2 cũng liên quan dến đơn vị dữ liệu là dòng dữ liệu
có matk=1.
 Hai hành động của 2 giao tác này xử lý trên cùng một đơn vị dữ liệu nên xảy ra xung
đột. Nếu T2 thực hiện trước T1 thì khi T2 xem số dư tài khoản xong sau vài giây số dư
đã khác rồi, ngược lại nếu T1 thực hiện trước thì khi T2 xem số dư cũng khác với lúc
dự định xem. Việc xung đột này có xảy ra nhưng không nguy hiểm cho dữ liệu lắm trừ
trường hợp cần báo cáo số liệu chính xác ngay thời điểm đó. Tình huống này trong lý
thuyết Hệ QTCSDL người ta xem là xung đột dữ liệu.
Ngoài ra, chúng ta cũng nhận thấy:
 Nếu 2 hành động ghi của 2 giao tác xử lý trên cùng một đơn vị dữ liệu chắc chắn
xảy ra xung đột mà là xung đột nguy hiểm vì cùng thay đổi trên một đơn vị dữ liệu.

 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.)

2. BIỂU DIỄN LỊCH GIAO TÁC


Có 3 cách biểu diễn lịch giao tác như sau:
- Cách 1 là biểu diễn đầy đủ nhất
- Cách 2 chỉ biểu diễn các hành động đọc, ghi => Cách này thường dùng cho thuật toán
kiểm tra lịch khả tuần tự xung đột (cách này bỏ qua các lệnh gán của biến cục bộ vì
không ảnh hưởng đến vấn đề xung đột dữ liệu khi đọc và ghi)
- Cách 3 Cách này biểu diễn cho ngắn gọn các hành động đọc, ghi theo dãy thứ tự.
Chú ý: Lệnh đọc và ghi là xử lý trực tiếp ngay trên dữ liệu, có nghĩa là đọc hay ghi vào table
của CSDL. Các lệnh gán như t:=t+100 là phép gán các biến thực hiện trên bộ nhớ và thường
là trên bộ nhớ của máy user, các lệnh gán này không ảnh hưởng gì đến xung đột dữ liệu của
các giao tác.

3. LỊCH KHẢ TUẦN TỰ LÀ GÌ?


Chúng ta xem 2 lịch tuần tự S1 và S2 như sau:

- Trong lịch tuần tự S1 thì T1 thực hiện xong rồi đến T2


- Trong lịch tuần tự S2 thì T2 thực hiện xong rồi đến T1
Điều kiện ràng buộc về nhất quán dữ liệu trong ví dụ này là A=B.
- Trước khi S1 thực hiện A=B=25; Sau khi S1 thực hiện thì A=B=250
- Trước khi S1 thực hiện A=B=25; Sau khi S1 thực hiện thì A=B=150
Vì vậy, cà 2 lịch S1 và S2 đều đảm bảo được tính nhất quán.
Bây giờ, chúng ta xây dựng lịch xử lý đồng thời S3 như sau:

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.

4. LỊCH KHẢ TUẦN TỰ XUNG ĐỘT (CONFLICT SERIALIZABILITY)


Có 2 loại lịch khả tuần tự như sau:

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.

+ Chúng ta tìm hiểu thêm một số thông tin về Ti <S Tj


Tóm lại, trong bước 3, muốn vẽ được 1 cung từ đỉnh i đến đỉnh j thì phải có một hành động
trong giao tác Ti thực hiện trước một hành động trong giao tác Tj và hai hành động này phải
xung đột. Chúng ta có 3 tình huống xung đột như sau:
+ Ri(X) thực hiện trước Wj(X) => Lệnh đọc dữ liệu X trong Ti thực hiện trước lệnh ghi
dữ liệu X trong Tj (hai hành động này không nhất thiết phải liên tiếp)
+Wi(X) thực hiện trước Rj(X) => Lệnh ghi dữ liệu X trong Ti thực hiện trước lệnh đọc dữ
liệu X trong Tj (hai hành động này không nhất thiết phải liên tiếp)
+Wi(X) thực hiện trước Wj(X) => Lệnh ghi dữ liệu X trong Ti thực hiện trước lệnh ghi
dữ liệu X trong Tj (hai hành động này không nhất thiết phải liên tiếp)
Như vậy, chúng ta chỉ cần sử dụng 3 tình huống trên để xác định cung từ Ti đến Tj.
- Bước 4: Dựa vào đồ thị đã hoàn thiện
+ Nếu đồ thị không có chu trình => Lịch giao tác khả tuần tự xung đột và thứ tự
hình học các đỉnh là thứ tự các giao tác trong lịch tuần tự tương đương với lịch giao
tác đang kiểm tra.
+ Nếu đồ thị có chu trình => Lịch giao tác không khả tuần tự xung đột
-------------------------------
Bây giờ, chúng ta làm từng bước các ví dụ để hiểu rõ hơn thuật toán.
Ví dụ 1: Cho lịch sao tác S10 như sau:
S10: R2(A); R1(B); W2(A); R3(A); W1(B); W3(A); R2(B); W2(B)
Kiềm tra xem S10 có khả tuần tự xung đột không?
Bước 1: Biểu diễn S10 theo cách 2 như sau:
Bước 2: Xác định các đỉnh của đồ thị. Lịch S10 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 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.

- Từ đỉnh 2 đến đỉnh 1 có cung không?


Chúng ta nhận thấy không có 2 hành động nào của 2 giao tác này xung đột cả khi hành động
trong T2 thực hiện trước hành động trong T1. Lệnh Read(A) và Write(A) của T2 không ảnh
hưởng đến Read(B) và Write(B) của T1 vì khác đơn vị dữ liệu; Mặt khác lệnh Read(B) và
Write(B) của T2 thực hiện sau các lệnh Read(B) và Write(B) của T1 nên không xảy ra xung
đột.
Vậy không có cung từ đỉnh 2 sang đỉnh 1.
- Từ đỉnh 1 đến đỉnh 3 có cung không?
Chúng ta nhận thấy không có 2 hành động nào của 2 giao tác này xung đột cả khi hành động
trong T1 thực hiện trước hành động trong T3. Trong T1 xử lý trên đơn vị dữ liệu B, còn trên
T3 xử lý trên đơn vị dữ liệu A, khác đơn vị dữ liệu nên không xảy ra xung đột.
Vậy không có cung từ đỉnh 1 sang đỉnh 3.
- Từ đỉnh 3 đến đỉnh 1 có cung không?
Chúng ta nhận thấy không có 2 hành động nào của 2 giao tác này xung đột cả khi hành động
trong T3 thực hiện trước hành động trong T1. Trong T1 xử lý trên đơn vị dữ liệu B, còn trên
T3 xử lý trên đơn vị dữ liệu A, khác đơn vị dữ liệu nên không xảy ra xung đột.
Vậy không có cung từ đỉnh 3 sang đỉnh 1.
- Từ đỉnh 2 đến đỉnh 3 có cung không?
Chúng ta thấy có tới 3 tình huống xảy ra xung đột như sau:

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:

- Từ đỉnh 3 đến đỉnh 2 có cung không?


Chúng ta nhận thấy không có 2 hành động nào của 2 giao tác này xung đột cả khi hành động
trong T3 thực hiện trước hành động trong T2. Lệnh Read(A) và Write(A) của T3 thực hiện sau
các lệnh Read(A) và Write(A) của T2; mặt khác lệnh Read(A) và Write(A) của T3 không ảnh
hưởng đến Read(B) và Write(B) của T2 vì khác đơn vị dữ liệu nên không xảy ra xung đột.
Vậy không có cung từ đỉnh 3 sang đỉnh 2.
Bước 4: Đồ thị hoàn thiện 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, ….

Ví dụ 2: Cho lịch giao tác S11 như sau:

Kiềm tra xem S11 có khả tuần tự xung đột không?


Bước 1: Biểu diễn S11 theo cách 2 như sau:

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.

- Từ đỉnh 2 đến đỉnh 1 có cung không?


Chúng ta thấy có một tình huống xảy ra xung đột như sau. Chúng ta nhớ vì từ 2 sang 1, nên
hành động bên T2 phải thực hiện trước, hành động bên T1 thực hiện sau trên cùng một đơn vị
dữ liệu.

Vậy ta vẽ cung từ đỉnh2 sang đỉnh 1 như sau:

- Từ đỉnh 1 đến đỉnh 3 có cung không?


Chúng ta nhận thấy không có 2 hành động nào của 2 giao tác này xung đột cả khi hành động
trong T1 thực hiện trước hành động trong T3. Trong T1 xử lý trên đơn vị dữ liệu B, còn trên
T3 xử lý trên đơn vị dữ liệu A, khác đơn vị dữ liệu nên không xảy ra xung đột.
Vậy không có cung từ đỉnh 1 sang đỉnh 3.
- Từ đỉnh 3 đến đỉnh 1 có cung không?
Chúng ta nhận thấy không có 2 hành động nào của 2 giao tác này xung đột cả khi hành động
trong T3 thực hiện trước hành động trong T1. Trong T1 xử lý trên đơn vị dữ liệu B, còn trên
T3 xử lý trên đơn vị dữ liệu A, khác đơn vị dữ liệu nên không xảy ra xung đột.
Vậy không có cung từ đỉnh 3 sang đỉnh 1.
- Từ đỉnh 2 đến đỉnh 3 có cung không?
Chúng ta thấy có tới 3 tình huống xảy ra xung đột như sau:

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:

- Từ đỉnh 3 đến đỉnh 2 có cung không?


Chúng ta nhận thấy không có 2 hành động nào của 2 giao tác này xung đột cả khi hành động
trong T3 thực hiện trước hành động trong T2. Lệnh Read(A) và Write(A) của T3 thực hiện sau
các lệnh Read(A) và Write(A) của T2; mặt khác lệnh Read(A) và Write(A) của T3 không ảnh
hưởng đến Read(B) và Write(B) của T2 vì khác đơn vị dữ liệu nên không xảy ra xung đột.
Vậy không có cung từ đỉnh 3 sang đỉnh 2.
Bước 4: Đồ thị hoàn thiện 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.

------------------- Chúc các bạn làm bài thật tốt -----------------

You might also like