a. Các thuật toán kiểm soát đồng hành dựa trên khoá (Locking-Based)
-X ì gán cho T i lock-X trên D
write(D)
end
hóa để không có vấn đề gì xảy ra. Đây là ý tưởng
ng pha thu hồi. Tại đây, các khóa sẽ được phép giải phóng vào thời điểm cầ
Chứng
Ö Hiện t giả:
hao tác đọc trên D – read(D):
đã có khó read(D
lại thì
(nếu cần thiết) đợi đến khi không còn giao tác nà
X (lock-X
end
hao tác ghi trên D – write(D):
đã có lock
write(D
lại thì
(nếu cần thiết) đợ
kỳ khóa trên D
đang giữlock-S trên D thì nâng cấp khóa trên D thành lock ngược lại th
Thuật toán chung dựa trên khóa: Khi cần truy cập vào một mục dữ liệu, chúng ta cần đến một khóa và khi cần dùng đến khóa đó nữa thì sẽ giải phóng nó ra. Ví dụ, có hai giao tác T1 và T2 , T1 có thể ghi vào mục dữ liệu x trước T2 và T2 lại có thể ghi vào mục dữ liệu y trước T1. Như vậy không có gì đảm bảo tính tuần tự cả. Vì lẽ đó chúng ta cần phải cân nhắc trong việc giữ k
cơ bản của thuật toán khóa hai pha.
Trong 2PL, tại pha tăng trưởng, các giao tác sẽ yêu cầu khóa cho mình mà không có sự giải phóng bất kỳ khóa nào. Các khóa sẽ không được giải phóng cho đến khi tất cả các khóa đã được gán hết. Sau khi tất cả các khóa đã được gán, các giao tác đuwocj phép chuyển sa
n thiết.
minh tính đúng đắn của thuật toán:
♦ Giả sử rằng T1 ưu tiên hơn T2 khi xảy ra đụng độ trong quá trình truy cập vào mục dữ liệu x, và T2 lại ưu tiên hơn T1 đối với mục dữ liệu y.
♦ Điều đó có nghĩa rằng T1 sẽ có quyền giữ khóa trước T2 trên x và T2
Khi T2 thực hiện thao tác xong, mục dữ liệu y được T2 giải phóng và được T1 nắm giữ. Nhưng T2 phải giữ khóa trên y khi lấy khóa trên x. Trong trường hợp này T1 sẽ không còn cách nào để lấy được khóa trên
minh.
Điểm h
không thể biết thời điểm các giao tác bắt đầu giả phóng khóa Ví dụ: thực hiện đồng thời hai giao tác rút $100 và chuyển $100 từ tài khoản:
T1 T2
y.
♦ Điều phải chứng
ạn chế của 2PL:
+ Hiệu ứng Domino: khi T1 giải phóng các khóa thì T2 lại thực hiện thao tác đọc các đối tượng đã được giải phóng. Khi đó T1 sẽ bị bỏ qua. + SC chốt. ⇒ Rút $10 c của thao tác “kiểm current – 100 uá trình Dispense Cash ⇒ Chuyển u” 00 ọc của thao tác “kiểm t + 100 ai động)
¾ Mở khóa “kiểm tra”
0
¾ Khóa “kiểm tra”
¾ đọ tra” > new = ¾ Ghi ¾ Hoàn tất q ¾ Mở khóa ¾ $100 ¾ Khóa “lưu” ¾ Đọc của thao tác “lư > new = current - 1
¾ Khóa kiểm tra
¾ Đ
tra”
> new = curren
¾ Ghi “lưu”
¾ Ghi “kiểm tra”
¾ Hoàn tất quá trình (hai gi đoạn chuyển * hành
¾ Mở khóa “lưu”
ii.
cập vào mục dữ liệu dùng chung thì các quy
ất cả các khoá sẽ được các giao tác giữ lại cho đến khi kết thúc thao Biểu đồ S2PL như sau:
Khoá hai pha nghiêm ngặt - Strict 2PL (S2PL)
2PL là một phiên bản mở rộng của nghi thức S2PL. Ngoài quy tắc các giao tác cần phải yêu cầu cấp khoá đọc/ghi trước khi truy
tắc khác được quy định lại như sau:
Ö T tác.
Tương tự như 2PL, S2PL cũng thực thi các giao tác trong hai pha: Pha tăng trưởng và và pha còn lại là là pha mà các giao tác sử dụng các mục dữ liệu đã bị khoá.
Khi các giao tác đã được hoàn tất hoặc bị huỷ bỏ nó sẽ giải phóng tất cả các khoá cùng một lúc.
S2PL chỉ cho phép các lịch biểu tuần tự như sau:
Biểu đồ S2PL:
Khoảng thời gian giao tác tồn tại Giành khoá Giải phóng khoá BEGIN END Thời gian Số
khoá Khoá bị giữ đến khi
Ví dụ về S2PL:
iii. Khoá hai pha tập trung (Centralized 2PL – C2PL)
Ö Tất cả các yêu cầu về tài nguyên phải được gửi đến một vị trí được gọi là bộ điều khiển khoá (Lock Controller - LC).
Ö LC sẽ duy trì một bảng khoá của tất cả các tài nguyên của hệ thống.
Ö Trước khi một vị trí có thể thực hiện một giao tác, nó phải nhận được khoá chốt từ LC.
Ưu điểm:
♦ Yêu cầu ít thông điệp hơn so đối với việc thiết lập các khoá chốt so với các thuật toán khoá chốt phân tán.
Nhược điểm:
♦ Độ tin cậy kém; yêu cầu phải có hệ thống sao lưu.
♦ LC phải duy trì một số lượng lớn các giao dịch.
iv. Khoá hai pha bản sao chính (Primary Copy 2PL – PC2PL)
Ö PC2PL được phát triển trực tiếp từ 2PL. Về cơ bản, các bộ quản lý khoá nằm ở một số vị trí và bộ quản lý khoá quản lý một tập các mục dữ liệu nhất định. Các bản sao mục dữ liệu nằm trên hệ thống phân tán nhưng sẽ có một bản sao được hiểu như là bản sao chính (Primary copy), các bản sao khác được coi như là bản thứ yếu (Slave copy).
Ö Chỉ cần khoá ghi (write-lock) bản sao mục dữ liệu chính thì mục dữ liệu đó có thể cập nhật được.
Ö Mỗi khi bản sao chính được cập nhật, sự thay đổi đó sẽ được nhân ra cho các bản sao thứ yếu.
Ưu điểm:
♦ PC2PL làm giảm bớt tác vụ cho vị trí trung tâm (hiệu năng làm việc) tốt hơn C2PL.
♦ Chi phí giao tiếp thấp.
Nhược điểm:
♦ Kiểm soát điểm chết phức tạp.
♦ Degree vẫn còn vị trí trung tâm.
v. Khoá hai pha phân tán (Distributed 2PL)
Trong D2PL, các LM tồn tại trên mỗi vị trí. Không giống PC2PL, khi một giao tác cần truy cập vào một tập đơn vị nào đó thì cần phải nhận được khoá trên tất cả các bản sao của nó tại mọi vị trí khác nhau.
Khi dữ liệu không được tạo thành các bản sao thì chỉ tồn tại một bản tại một vị trí duy nhất. Khi đó D2PL trở thành PC2PL. Còn khi bản sao được thực hiện thì nghi thức ROWA (Read-One-Write-All) được thực hiện.
Khi sử dụng nghi thức ROWA:
Ö Bản sao bất kỳ nào đấy của mục dữ liệu có thể được sử dụng để đọc (read).
Ö Tất cả các bản sao phải được khoá ghi (write-locked) trước khi tiến hành cập nhật.
Các bước cụ thể:
b1: Đợi giao tác từ phía người dùng.
b3: Nếu có bất kỳ khoá chốt nào bị từ chối thì gửi thông điệp giải phóng khoá đó và nhảy về bước 2 để tiếp tục thử lại sau một khoảng thời gian nhất định.
b4: Thực hiện giao tác cục bộ (local transaction) và gửi n thông điệp cập nhật.
b5: Đợi cập nhật các thông điệp ACK
b6: Gửi n thông điệp giải phóng khoá, nhắc nhở giao tác đã hoàn tất và quay về bước 1.
Nhược điểm:
♦ Kiểm soát điểm chết phức tạp.
♦ Chi phí giao tiếp lớn hơn so với PC2PL.
♦ Tốn nhiều thời gian.
♦ Độ trễ lớn.
b. Các thuật toán kiểm soát đồng hành dựa trên Nhãn thời gian (TS)
Các thuật toán loại này không cố gắng bảo đảm tính tuần tự bởi vì chúng sẽ loại trừ lẫn nhau. Thay vào đó, chúng sẽ sắp xếp các giao tác Ti theo tiêu chí nhãn thời gian TS(Ti). TS(Ti) đối với mỗi giao tác là duy nhất nhằm phục vụ cho mục đích sắp xếp thứ tự: nếu một giao tác Ti trước đó đã có nhãn thời gian là TS(Ti) thì một giao tác mới, Tj, có TS(Tj) với TS(Tj) < TS(Ti).
TS có thể được gán dựa vào thời gian của hệ thống hoặc một vài bộ đếm luận lý tăng dần theo mỗi TS được gán.
Các nghi thức TS không sử dụng khoá chốt, vì vậy điểm chết sẽ không thể xuất hiện.
Ö Các quy tắc của lớp thuật toán này:
♦ Hai thao tác O1 và O2 thuộc hai giao tác T1 và T2 (O1 và O2 xung đột với nhau) khi đó O1 sẽ được thực hiện trước O2 nếu và chỉ nếu T1 < T2. T1 được hiểu là giao tác “cũ hơn” còn T2 được hiểu là giao tác “mới hơn”.
♦ Bộ SC, trong khi thực hiện một thao tác mới, kiểm tra tất cả các thao tác xung đột. Nếu thao tác đó thuộc một giao tác “cũ nhất” thì nó sẽ được thực hiện, ngược lại, toán bộ các giao tác của thao tác đó sẽ được khởi động lại và nhận một TS mới.
Để đảm bảo tính tuần tự, nghi thức này sử dụng hai giá trị nhãn thời gian cho mỗi mục dữ liệu Q như sau:
W-timestamp(Q) hay W
♦ TS(Q): nhãn thời gian lớn nhất của giao tác bất kỳ
đã thực thi write(Q) thành công.
WTS(Q) = max(TS(T) | T đã đọc Q}
♦ RR-timestamp(Q): nhãn thời gian lớn nhất của giao tác bất kỳ đã thực thi
read(Q) thành công.
RTS(Q) = max(TS(T) | T đã ghi lên Q}
Các nhãn thời gian đọc và ghi trên mục dữ liệu được phân phối bởi bộ SC trong khi các nhãn thời gian giao tác và các nhãn thời gian thao tác lại được phân phân bởi TM.
Một điểm nữa là bộ lập lịch TO luôn tạo ra các lịch biểu tuần tự. Nghi thức TO đảm bảo bất kỳ thao tác read và write mâu thuẫn nào cũng đều được thực hiện theo thứ tự
nhãn thời gian.
Ö Tính đúng đắn của nghi thức thứ tự nhãn thời gian:
Nghi thức TO đảm bảo tính tuần tự khi tất cả các cung của đồ thị quyền ưu tiên (precedence graph) có dạng sau:
Giao tác có thời nhãn nhỏ hơn Giao tác có thời nhãn lớn hơn
Như vậy sẽ không có chu trình (cycle) trong đồ thị
2.1 Thuật toán TO cơ bản
Trong TO cơ bản, bộ TM phân phối các nhãn thời gian cho giao tác và gửi các thao tác tương ứng đến vị trí liên quan. Điều này là dễ hiểu vì nó chỉ làm theo quy tắc của TO. Đến đây, bộ lập lịch TO kiểm tra nhãn thời gian của các thao tác. Nếu đây là thao tác có nhãn thời gian cũ nhất trong số các thao tác có sự đụng độ với nhau thì nó được phép thực thi, nếu ngược lại thì giao tác sẽ bị khởi động lại với một nhãn thời gian mới. Từ đó dẫn đến việc các giao tác sẽ không bao giờ ở trạng thái chờ khi chúng truy cập vào các mục dữ liệu và vì vậy các điểm chết cũng không có khả năng phát sinh. Tuy nhiên điều đó vẫn có thể xảy ra trong trường hợp các giao tác bị khởi động lại nhiều lần. Ngoài ra, một vấn đề cần được quan tâm là quá trình đồng bộ hóa giữa bộ SC và bộ xử lý dữ liệu DP.
Bộ SC cần lưu ý xử lý việc nó điều phối một cách chính xác các thao tác trên cùng một mục dữ liệu mà nó chuyển đến một DP khác, nếu không tác dụng trên cơ sở dữ liệu sẽ bị sai. Có thể tránh được sự cố này bằng cách duy trì một hàng đợi và đợi DP báo nhận khi thao tác trước đó là trên cùng một mục dữ liệu.
Thuật toán TO cơ bản:
Case “thao tác” of
read: if TS(T) < WTS(x) then “từ chối (hay lập lịch lại) thao tác read”;
else
• “thực hiện” thao tác read(x);
• RTS(x) := max {RTS(x), TS(T)};
end.
write: if TS(T) < max{RTS(x), WTS(x)} then “từ chối thao tác” write
else begin • “thực hiện” thao tác write(x); • WTS(x) := TS(T); end. End case Hạn chế của BTO:
BTO cố gắng thực thi các thao tác ngay khi có thể được, vì vậy thuật toán này thay vì phải chờ, nó sẽ khởi động lại các thao tác
2.2 Thuật toán TO bảo thủ
Điểm bất lợi chính yếu của thuật toán TO cơ bản là các bộ đếm là độc lập. Điều này dẫn đến trường hợp bộ đếm của một vị trí riêng nào đấy trục trặc. Kết quả là có thể có nhiều sự huỷ bỏ cho đến khi bộ đếm của các vị trí thấp tiến đến bằng với bộ đếm của các vị trí khác. Cách giải quyết vấn đề này là giữ lại một bộ đếm được đồng bộ hoá mà không cần có sự giao tiếp giữa các vị trí vì rằng điều đó sẽ rất tốn kém. Một ví dụ của bộ đếm như vậy là đồng hồ hệ thống.
Trong thuật toán TO bảo thủ (CTO), bộ SC dành một hàng đợi cho mỗi TM. Hàng đợi bao gồm các thao tác đọc và ghi đã sắp hàng trong hàng đợi RQ và WQ. Ý tưởng là nên trì hoãn việc thực hiện thao tác cho đến khi chắc rằng không có thao tác TS nào nhỏ hơn khác nữa.
Như vậy các thao tác trong hàng đợi được sắp theo thứ tự tăng dần của thời nhãn và chúng được thự thi theo cùng thứ tự.
Cho TS(Q) là nhãn thời gian của thao tác đầu tiên trong hàng đợi. Qua trình so sánh luôn thực hiện với thao tác đầu tiên trong bất kỳ hàng đợi nào. Hai trường hợp tương ứng của thuạt toán CTO được trình bày dưới đây dưới dạng ngôn ngữ giả:
Thuật toán TO bảo thủ (CTO):
read: if TS(T) < WTS(x) then “từ chối” read
else
if lock_queue(x) # ∅ and TS(T) > min{TS(T’) | T’∈ lock_queue(x)}
then
“chèn” read(x) vào read_queue(x);
else
begin
• “thực hiện” read(x);
• RTS(x) := max{RTS(x), TS(T)};
end;
lock: if TS(T) < max{RTS(x), WTS(x)} then “từ chối” lock
else “chèn” lock(x) vào lock_queue(x);
write: lr_queue := lock_queue(x) ∪read_queue(x);
if TS(T) > min{TS(T’) | T’∈ lr_queue(x)} then “chèn” write(x) vào write_queue(x);
else
begin
• “thực hiện write(x);
• “xoá lock tương ứng” trong lock_queue(x);
• WTS(x) := TS(T);
• “kiểm tra các thao tác có thể thực hiện được” trong read_queue(x) và write_queue(x)
end;
Thuật toán CTO làm giảm số lần phải khởi động lại các thao tác bằng cách sử dụng hàng đợi. Tuy nhiên khi bộ TM không có bất kỳ thao tác nào để thực hiện thì nó phải gửi các thao tác giả đến SC, vì vậy nó biết rằng các thao tác sau đó sẽ có thời nhãn lớn hơn hoặc bằng thời nhãn giả đã gửi đi.
2.3 Thuật toán TO đa bản (MTO)
Thuật toán MTO duy trì một bản “lý lịch” của các thời nhãn đọc TS(Rx) và các phiên bản cho một đối tượng x riêng biệt.
Các phiên bản là bộ đôi có dạng <TS(Wx), value>. Mỗi đối tượng đều phải có một “lý lịch” và các phiên bản như trên.
Thuật toán: TO đa bản (MTO) read <object,TS>
đọc vj với j = max{i|W-tsi<TS}
Thêm<TS> vào read history write<object, val, TS>
if (tồn tại k thoả TS<R-tsk<W-tsj với j = min {i|TS<W-tsi})
then
Từ chối thao tác
else
Thêm<TS, vl>vào versions
Bộ MTO tạo ra các lịch tuần tự. Nó cung làm giảm đi tỷ lệ các thao tác bị hủy bỏ (abort) so với 2 thuật toán TO trước đây. Vấn đề xảy ra với MTO là có cần có nhiều dung lượng để duy trì các phiên bản khác nhau của mỗi đối tượng trong cơ sở dữ liệu. một kỹ thuật thường được dùng để khắc phục tình trạng trên là xóa bỏ những phiên bản đã cũ khỏi dữ liệu.
Trên đây chúng ta đã đi qua các thuật toán pessimistic sử dụng khóa chốt và thời nhãn. Những nhận xét ban đầu cho thấy bộ lập lịch TO cho kết quả tốt hơn bộ lập lịch 2PL trong trường hợp giả thiết đầu vào là tập hợp của các giao tác nhỏ. Tuy nhiên điều này đã không còn đúng khi tiếp tục phân tích sâu hơn nữa các thuật toán này. Hiệu năng của các bộ lập lịch TO bị đánh giá thấp khi các giao tác là đủ lớn.
c. Các thuật toán kiểm soát đồng hành Optimistic (OCC)
Tiến trình thực thi Pessimistic và Optimistic:
Pessimistic
Optimistic
Trong OCCP, ý tưởng ban đầu là nên cho phép các giao tác thực hiện tự do vì đã giải định rằng hầu hết các giao tác không đụng độ với nhau. Nếu có ít các xung đột hơn thì OCCP sẽ hoạt động hiệu quả hơn các nghi thức dựa trên khoá.
Các thuật toán Opmistic xem một thao tác bất kỳ của một giao tác gồm 4 pha như sau: pha hiệu lực (V: Validation), pha đọc (R: Read), pha tính toán (C:Computation) và cuối cùng là pha ghi (W: Write). Trong OCCP, các giao tác được làm cho hợp lệ ngay trước khi pha ghi khi các sửa đổi được lưu vào cơ sở dữ liệu. Do vậy các giao tác được phép khởi đầu mà không cần phải trì hoãn một khi được chuyển đến bộ SC Optimistic, tức là chúng được phép thực hiện các pha đọc và tính toán.
Mỗi giao tác đọc dữ liệu, thực hiện tính toán và tạo các bản sao chép cục bộ của những