Các khái niệm
Các vấn đề bất thường trong truy xuất đồng thời
Lịch thao tác (Schedule)
Kỹ thuật khóa
Kỹ thuật nhãn thời gian
Các kỹ thuật khác
Truy xuất đồng thời (Access Concurrency)
Giao tác (Transaction)
Đơn vị dữ liệu (Granule)
Các truy xuất dữ liệu của CSDL xảy ra cùng thời
gian trong môi trường nhiều người dùng (multi user)
Truy xuất đồng thời không tranh chấp :
◦ n truy xuất trên n dữ liệu khác nhau
Truy xuất đồng thời có tranh chấp :
◦ n truy xuât đồng thời trên k dữ liệu chung.
Là một dãy các thao tác (actions) trên dữ liệu
được coi như là một đơn vị xử lý nguyên tố
(processing unit)
Các xử lý bên trong một giao tác phải hoàn thành
tất cả hoặc thất bại tất cả.
Khi một giao tác được thực hiện hoàn tất thì nó
phải đảm bảo tính nhất quán của CSDL (biến
CSDL thành một trạng thái nhất quán mới)
Nguyên tố (Atomicity)
◦ Một giao tác là một đơn vị xử lý nguyên tố không chia
nhỏ được
Nhất quán (Consistency)
◦ Biến cơ sở dữ liệu từ trạng thái nhất quán này đến trạng
thái nhất quán khác
Cô lập (Isolation)
◦ Không bị ánh hưởng bởi các giao tác khác
Bền vững (Durability)
◦ Các thay đổi mà giao tác thực hiện trên dữ liệu của
CSDL phải được phản ánh bền vững lên CSDL
Active giai đoạn đầu tiên khi giao tác bắt đầu thực thi
Partially committed sau khi lệnh cuối cùng trong giao
tác thi hành.
Failed sau khi phát hiện không thể thực hiện bình
thường được.
Aborted sau khi giao tác bị rolled back và CSDL phục
hồi lại trạng thái trước của nó. Hai lựa chọn khi một
giao tác bị abort:
◦ Khởi động lại giao tác
◦ Hủy giao tác
Committed
◦ Sau khi thực hiện thành công.
Partially
committed
Committed
Active
Failed
Aborted
Giảsử CSDL đang ở trạng thái nhất quán
SELECT FNAME, LNAME
FROM EMPLOYEE
WHERE EMP_NUM=‘10201’
Sau khi thực hiện câu lệnh SQL thì CSDL vẫn giữ
nguyên được trạng thái nhất quán
Không có sự thay đổi nào xảy ra trên CSDL.
Giả sử CSDL đang ở trạng thái nhất quán
Update TAIKHOAN
Set SoDu=SoDu-50
Where MATK=A
Update TAIKHOAN
Set SoDu=SoDu+50
Where MATK=B
CSDL vẫn giữ nguyên được trạng thái nhất quán
(nếu như cả hai câu lệnh SQL ở trên đều thành
công hoặc đều thất bại)
Hệ QTCSDL không chắc là lúc nào thực tế cũng
diễn ra như thế.
BEGIN
TRANSACTION
COMMIT
TRANSACTION
ROLLBACK
TRANSACTION
Bắt đầu giao tác
Kết thúc giao tác
Hủy giao tác
Là khối lượng dữ liệu nhỏ nhất mà CSDL có thể
thao tác
Đơn vị dữ liệu có thể là
◦
◦
◦
◦
Trường (Field)
Mẫu tin (Record)
Bảng (Table)
CSDL (Database)
Kích thước của đơn vị dữ liệu ánh hưởng đến
hiệu năng xử lý đồng thời
Các khái niệm
Các vấn đề bất thường trong truy xuất đồng thời
Lịch thao tác (Schedule)
Kỹ thuật khóa
Kỹ thuật nhãn thời gian
Các kỹ thuật khác
1.
2.
3.
4.
Vấn đề mất dữ liệu đã cập nhật
Vấn đề không thể đọc lại
Vấn đề đọc phải dữ liệu chưa được xác nhận
Vấn đề bóng ma
T1
Begin Tran
Read A
T2
Begin Tran
Read A
A:=A+10
Write A
A:=A*100
Write A
Commit Tran
Commit Tran
T1
Begin Tran
T2
Read A
Begin Tran
Read A
A:=A+10
Write A
Commit Tran
Read A
Commit Tran
T1
Begin Tran
Read A
T2
A:=A+10
Begin Tran
Write A
Read A
Print A
Abort
Commit Tran
T1
Read(A)
T2
Read(A)
A:=A-10
Write (A)
Read(B)
Read(B)
Print(A+B)
B:=B+10
Write(B)
Các khái niệm
Các vấn đề bất thường trong truy xuất đồng thời
Lịch thao tác (Schedule)
Kỹ thuật khóa
Kỹ thuật nhãn thời gian
Các kỹ thuật khác
Định nghĩa lịch thao tác
Lịch tuần tự - khả tuần tự
Thuật toán kiểm tra tính khả tuần tự
Lịch thao tác của n giao tác xử lý đồng thời
T1,T2,….,Tn là một thứ tự thực hiện các hành động
của n giao tác này
Lịch thao tác phải đảm bảo thứ tự của các hành
động trong cùng một giao tác
Một lịch S được lập từ n giao tác xử lý đồng thời
T1,T2,….,Tn được gọi là lịch tuần tự nếu với mọi
giao tác Ti, các hành động của Ti được thực hiện
liên tiếp nhau
Một lịch S lập từ n giao tác xử lý đồng thời
T1,T2,….,Tn được gọi là lịch khả tuần tự nếu khi
thực hiện S, cho kết quả giống một lịch tuần tự
nào đó được lập từ n giao tác này
Hai thao tác Oi,Oj của hai giao tác xử lý đồng thời
Ti,Tj được gọi là tương thích nếu việc thực hiện
theo thứ tự < Oi,Oj > cho kết quả giống việc thực
hiện theo thứ tự <Oj,Oi >
Hai thao tác thực hiện trên hai đơn vị dữ liệu khác
nhau thì tương thích
Hai thao tác tương thích Oi,Oj có thể thay đổi thứ
tự thực hiện cho nhau mà không làm thay đổi kết
quả, nên còn được gọi là hai thao tác khả hoán
Bảng khả hoán của hai thao tác trên cùng đơn vị
dữ liệu
Read
Write
Read
Yes
No
Write
No
No
Một lịch S được gọi là khả tuần tự nếu chúng ta
có thể giao hoán các thao tác khả hoán để đưa S
về một lịch tuần tự
S7
1
T1
T2
T3
Read(A);A:=A-10
2
Read(B);B:=B-20
3
Read(C); C:=C+B
4
Write(B)
5
Read(B);B:=B+10
6
Write(A)
7
Read(A);A:=A+5
8
Write(C)
9
Write(A)
10
Read(A);A:=A-20
11
Read(C);C:=C+20
12
Write(B)
13
Write(C)
14
Write(A)
Bộ lập lịch sẽ phải thực hiện các hành động của
nó theo các thuật toán điều khiển đồng thời
Đảm bảo đơn vị xử lý trung tâm của máy tính
(CPU) được xử dụng một cách hiệu quả
Tạo điều kiện về cô lập dữ liệu để đảm bảo rằng
hai giao tác không cập nhật cùng một đơn vị dữ
liệu ở cùng một thời điểm
Các khái niệm
Các vấn đề bất thường trong truy xuất đồng thời
Lịch thao tác (Schedule)
Kỹ thuật khóa
Kỹ thuật nhãn thời gian
Các kỹ thuật khác
Các kỹ thuật điều khiển đồng thời
Khóa đơn giản
Khóa đọc ghi
Khóa trên dữ liệu phân cấp
Những kỹ thuật cho phép bộ lập lịch sử dụng để
tạo một lịch khả tuần tự từ n giao tác thực hiện
đồng thời.
Kỹ thuật khoá đơn giản còn gọi khoá nhị phân (Binary locks)
Bộ lập lịch với cơ chế khóa đơn giản (locking scheduler)
◦ Là bộ lập lịch với thêm 2 hành động:
Lock: Khóa
Unclock: Giải phóng khóa
◦ Các khóa được ghi nhận trong bảng khóa (Lock Table)
Các giao tác trước khi muốn đọc/ghi lên 1 đơn vị
dữ liệu phải phát ra yêu cầu xin khóa (lock) đơn vị
dữ liệu đó.
◦ Ký hiệu Lock(A) hay l(A)
Yêu cầu này được bộ phận quản lý khóa xử lý
(Lock Manager)
◦ Yêu cầu xin khóa được chấp thuận nếu đơn vị dữ liệu
chưa bị khóa bởi một giao tác nào khác
Sau khi thao tác xong thì giao tác này phải phát ra
lệnh giải phóng đơn vị dữ liệu (unclock)
◦ Ký hiệu: Unclock(A) hay u(A)
Giao tác đúng đắn: Giao tác Ti đọc hay ghi lên
đơn vị dữ liệu A phải được thực hiện sau khi Ti
khóa trên A và trước khi Ti giải phóng khóa A.
◦ Ti: …..lock(A)….read(A)/write(A)…..unclock(A)
Lịch thao tác hợp lệ: Khi Ti đang giữ khóa trên
một đơn vị dữ liệu A thì không Ti nào khác được
khóa trên A.
S
Giao tác T1, T2 có
đúng đắn không?
Lịch S có hợp lệ
không
Giao tác Ti nào đúng đắn?
Lịch S nào hợp lệ?
Input: Lịch S được lập từ n giao tác xử lý đồng
thời T1,T2,…Tn theo kỹ thuật khóa đơn giản
Output: S khả tuần tự hay không?
Xây dựng 1 đồ thị có hướng G
◦ Mỗi giao tác Ti là đỉnh của đồ thị
◦ Nếu một giao tác Tj phát ra Lockj(A) sau một giao tác Ti
phát ra Locki(A) thì vẽ một cung từ Ti đến Tj
S khả tuần tự nếu G không có chu trình
Ví dụ
Lịch S có khả
tuần tự
không?
S
T1
T2
Lock(A)
Read(A); A:=A+100
Write(A)
Unlock(A)
Lock(A)
Read(A); A:=A*2
Write(A)
Unlock(A)
Lock(B)
Read(B); B:=B*2
Unlock(B)
Lock(B)
Read(B); B:=B+100
Write(B)
Unlock(B)
Bài tập
Lịch S có khả
tuần tự
không?
S
Bài tập
Lịch S có khả
tuần tự
không?
S
Vấn đề khóa sống (Live Lock)
Vấn đề khóa chết (Dead Lock)
Ngăn ngừa khóa chết
Một giao tác T phải xin khóa tất cả các
đơn vị dữ liệu mà mình sẽ thao tác, nếu
được chấp thuận tất cả thì sẽ thao tác,
ngược lại phải giải phóng các khóa đã
được cấp trên các đơn vị dữ liệu
Phát hiện khóa chết:
Xây dựng đồ thị chờ (Waiting Graph) G
◦ Mỗi giao tác là một nút của đồ thị G
◦ Nếu có giao tác Tj phát ra yêu cầu khóa đơn vị dữ liệu A,
và phải chờ vì A đã bị khóa bởi Ti, thì vẽ cung nối Ti,Tj
◦ Nếu G xuất hiện chu trình Xảy ra khóa chết
Trong một giao tác, tất cả các thao tác khóa đều
phải xảy ra trước các thao tác giải phóng khóa
Nếu lịch S thỏa nghi thức khóa 2 giai đoạn (2PL)
thì S khả tuần tự
Chứng
minh
2PL Có giải quyết
được vấn đề
deadlock không?!
Các kỹ thuật điều khiển đồng thời
Khóa đơn giản
Khóa đọc ghi
Khóa trên dữ liệu phân cấp
Định lý: Lịch S thỏa (1),(2),(3) thì S khả tuần tự
Các kỹ thuật điều khiển đồng thời
Khóa đơn giản
Khóa đọc ghi
Khóa trên dữ liệu phân cấp
Quan hệ TAIKHOAN(MATK, SODU)
Giao tác gửi và rút tiền
◦ Khóa relation
Các giao tác thay đổi giá trị số dư của 1 tài khoản X sẽ yêu
cầu khóa độc quyền
Vì khóa ở mức độ quan hệ nên toàn bộ bảng bị khóa
Các giao tác khác muốn truy cập tài khoản Y (khác X) cũng
phải chờ Vô lý Tốc độ xử lý chậm
◦ Khóa tuple hay disk block
2 Tài khoản ở 2 block khác nhau có thể cập nhật cùng thời
điểm Xử lý nhanh
Giao tác tính tổng tiền của các tài khoản
◦ Khóa relation?
◦ Khóa tuple hay disk block?
Quản lý khóa ở nhiều mức độ
◦ Tính chất hạt (granularity) tăng khi đơn vị dữ liệu bị khóa
càng lớn
◦ Tính đồng thời (concurrency) tăng khi đơn vị dữ liệu bị
khóa càng nhỏ
Relations là đơn vị dữ liệu khóa lớn nhất
Một relation gồm 1 hoặc nhiều blocks (pages)
Một block gồm 1 hoặc nhiều bộ (tuples)
Khóa thông thường
◦ Shared lock: S
◦ Exclusive lock: X
Khóa cảnh báo (warning lock)
◦ Warning (intention to) shared lock: IS
◦ Warning (intention to) exclusive lock: IX
Cho biết các khóa có thể cùng tồn tại trên một node
dữ liệu
Yêu cầu khóa
Trạng thái
hiện hành
Cho biết các khóa có thể phát trên node con khi
node cha đang có một khóa nào đó
1.
2.
3.
4.
5.
6.
Thỏa ma trận tương thích trên cùng một node
Khóa node gốc của cây trước
Thỏa ma trận tương thích giữa node cha và
node con
Ti thỏa 2PL
Ti có thể giải phóng node Q khi không có node
con nào của Q bị khóa bởi Ti
Trong trường hợp thêm mới hay xóa bỏ một
node Q thì cha của Q phải được khóa bằng X
trước
T2 có thể truy xuất f2.2 bằng khóa X được không?
T2 sẽ có những khóa gì?
T2 có thể truy xuất f3.1 bằng khóa X được không?
T2 sẽ có những khóa gì?
Các khái niệm
Các vấn đề bất thường trong truy xuất đồng thời
Lịch thao tác (Schedule)
Kỹ thuật khóa
Kỹ thuật nhãn thời gian
Các kỹ thuật khác
Giới thiệu
Kỹ thuật nhãn thời gian toàn phần
Kỹ thuật nhãn thời gian riêng phần
Kỹ thuật nhãn thời gian nhiều phiên bản
Một
giao tác T khi phát sinh thì được gán một
nhãn thời gian timestampTS(T) ghi nhận lại thời
điểm phát sinh của T.
Mỗi đơn vị dữ liệu A cũng có một nhãn TS(A)
nhãn này ghi lại nhãn thời gian TS(T) của giao tác
T đã thao tác (read/ write) A thành công sau cùng
Để giảm bớt trường hợp các giao tác bị Abort,
người ta tách nhãn của đơn vị dữ liệu thành hai
loại nhãn:
◦ ReadTimestamp A - RT(A): để ghi nhận TS(T) gần nhất
(giao tác có nhãn thời gian lớn nhất) đọc A thành công.
◦ WriteTimestamp A - WT(A): để ghi nhận TS(T) gần nhất
(giao tác có nhãn thời gian lớn nhất) ghi A thành công.
Gắn các nhãn thời gian TS(T), RT(A), WT(A)
Xử lý các tình huống:
◦
◦
◦
◦
Đọc quá trễ
Ghi quá trễ
Đọc dữ liệu rác
Qui tắc ghi Thomas
T vào trước U : TS(T)<TS(U)
U ghi X trước T: TS(T)<WT(X)
T không thể đọc X sau U
Hủy T
T vào trước U : TS(T)<TS(U)
U đọc X trước , T ghi X sau: WT(X)<TS(T)<RT(X)
T không nên ghi X do U đã đọc X (U phải đọc giá
trị do T ghi)
Hủy T
T vào trước U : TS(T)<TS(U)
U ghi X trước , T ghi X sau: ST(T)<WT(X)
T ghi X xong thì không làm được gì
◦ Không có giao tác nào đọc được giá trị X của T (nếu có
cũng bị hủy do đọc quá trễ)
◦ Các giao tác đọc sau T và U thì mong muốn đọc giá trị X
của U
Bỏ qua thao tác ghi của T
Khi có yêu cầu đọc hoặc ghi từ giao tác T. Bộ lập
lịch sẽ:
◦ Đáp ứng yêu cầu
◦ Hủy và khởi tạo lại T với 1 timestamp mới
◦ Trì hoãn T, sau đó mới quyết định hủy T hoặc đáp ứng
yêu cầu
Procedure Read(T,A)
if WT(A) <= TS(T) then
begin
Read(A) // Cho phép đọc A
RT(A):=MAX(RT(A),TS(T))
// Có thể người đi trước đã đọc
//nên phải lưu người trước
end
else
Abort {T} //Hủy T và khởi tại lại với TS mới
Procedure Write(T,A)
If RT(A) <= TS(T) then
If WT(A) <= TS(T) then
Begin
Write(A) // Cho phép ghi A
WT(A) :=TS(T)
End
//Else : RT(A) < TS(T) < WT(A)
//: không làm gì hết (bỏ qua)
Else Abort{T}
Abort
Abort
Giá trị của A đã ghi bởi T1
Bỏ qua thao tác này
Abort
Giữ lại nhiều phiên bản của một đơn vị dữ liệu.
Mỗi phiên bản có 2 nhãn RT và WT ghi nhận giao
tác cuối cùng đã read hoặc write thành công lên
nó
Khi giao tác T phát ra yêu cầu thao tác trên X
◦ Tìm 1 phiên bản thích hợp của X
◦ Đảm bảo tính khả tuần tự
Một phiên bản mới của X sẽ được tạo thành khi
hành động ghi X thành công
Procedure Read(T,A)
j:= ‘số thứ tự của phiên bản cuối cùng của A’
While WT(Aj) > TS(T)
j := j-1 // lùi phiên bản
Read(Aj)
RT(Aj) = MAX( RT(Aj),TS(T))
Procedure Write(T,A)
j:= ‘số thứ tự của phiên bản cuối cùng của A’
While WT(Aj) > TS(T)
j := j-1 // lùi phiên bản
if RTS(Aj) > TS(T) then
// chỉ có duy nhất một trường hợp này bị bỏ
Abort {T}
Else
Begin
// tạo/chèn phiên bản Aj+1
Write(Aj+1)
RT(Aj+1)=0
WT(Aj+1)=TS(T)
End
Thao tác đọc
◦ Giao tác T chỉ đọc giá trị của phiên bản do T hay những giao
tác trước T cập nhật
Thao tác đọc không bị hủy
Thao tác ghi
◦ Thực hiện được thì chèn phiên bản mới
◦ Không được thì hủy
Bao nhiêu Write thì có thể có tới bấy nhiêu phiên bản
Không bao giờ WT của các phiên bản giảm dần
Không bao giờ cập nhật WT và RT vào phiên bản cũ
Tốn nhiều chi phí tìm kiếm và tốn bộ nhớ