Hai thao tác xung đột

Một phần của tài liệu tìm hiểu một số thuật toán điều khiển tương tranh trong cơ sở dữ liệu phân tán (Trang 34 - 77)

6. Cấu trúc luận văn

2.4.3.Hai thao tác xung đột

Hai thao tác đƣợc gọi là xung đột nếu thỏa 3 điều kiện sau:

- Truy xuất cùng 1 mục dữ liệu x

- Chúng thuộc hai giao dịch khác nhau

Ví dụ:

Cặp thao tác <Ri(x), Wj(x)> và <Wi(x), Wj(x)> là xung đột

Cặp thao tác <Ri(x), Rj(x)>, <Wi(x), Wj(y)> và <Wi(x), Rj(y)> là không xung đột.

2.4.4. Tiến trình tương đương

Hai tiến trình đƣợc gọi là tƣơng đƣơng nếu bất kỳ hai thao tác xung đột nào trong cả hai tiến trình có cùng thứ tự.

Ví dụ :

S3: Ri(x)Rj(x)Wj(y)Wi(x)

Bảng này tƣơng đƣơng với bảng tuần tự sau: S4: Rj(x)Wj(y)Ri(x)Wi(x)

Bởi vì xuất hiện duy nhất cặp thao tác xung đột <Rj(x),Wi(x)> đúng trình tự trong cả hai bảng biểu.

2.4.5. Tiến trình khả tuần tự

Tiến trình S của n giao dịch đƣợc gọi là khả tuần tự nếu S tƣơng đƣơng với một tiến trình tuần tự S‟ của cùng n giao dịch.

Ví dụ: Tiến trình S khả tuần tự do tƣơng đƣơng với tiến trình tuần tự S‟

Bảng 2.4: Bảng biểu diễn tiến trình khả tuần tự

S S‟ T1 T2 T1 T2 Read_item(X) X:=X-N Write_item(X) Read_item(Y) Y:=Y+N Write_item(Y) Read_item(X) X:=X+M Write_item(X) Read_item(X) X:=X-N Write_item(X) Read_item(Y) Y:=Y+N Write_item(Y) Read_item(X) X:=X+M Write_item(X)

2.4.6. Tính khả tuần tự trong cơ sở dữ liệu phân tán

Thực hiện n tiến trình phân tán T1, T2, ….Tn ở m vị trí trong bảng cục bộ S1, S2, …., Sm.

S1(site 1): Ri(x) Wi(x) Rj(x) Wj(x) S2(site 2): Rj(y) Wj(y) Ri(y) Wi(y)

Nếu áp dụng với mỗi nút kỹ thuật điều khiển tƣơng tranh cục bộ. Chúng ta có thể đảm bảo rằng tất cả các bảng cục bộ đều có tính tuần tự. Tuy nhiên, tính tuần tự của bảng cục bộ không đủ đảm bảo rằng thực hiện đúng trong tiến trình phân tán Ti<Tj trong Serial(S1) và Tj<Ti trong Serial(S2).

CHƢƠNG 3

ĐIỀU KHIỂN TƢƠNG TRANH TRONG CƠ SỞ DỮ LIỆU PHÂN TÁN

- -

p

3.1. Cơ sở của điều khiển tƣơng tranh phân tán

Điều khiển tƣơng tranh là điều khiển các giao dịch đƣợc thực thi trùng nhau về mặt thời gian, xảy ra đồng thời.

Bài toán về các giao dịch thực hiện đồng thời

Có một CSDL về thông tin ngân hàng.

Accounts : chứa thông tin về tài khoản và số dƣ của khách hàng. Giả sử Account X có số tiền hiện tại là 1.000.000 đồng. (adsbygoogle = window.adsbygoogle || []).push({});

Nếu đồng thời có hai khách hành muốn chuyển tiền vào tài khoản này - Khách thứ nhất muốn chuyển vào 2.000.000 đồng

- Khách thứ hai là 100.000.000 đồng.

Nếu hai giao dịch thực hiện lần lƣợt, ta có dãy thực thi các hành động là: T1: Read(X) T1: X:=X+2.000.000 T1: Write(X) T1: Commit T2: Read(X) T2: X:=X+ 100.000.000 T2: Commit

Trƣờng hợp này: T2 đọc giá trị của của X là 3.000.000 và sau đó khi kết

thúc T2 có gía trị là 103.000.000 .

Tuy nhiên vì các giao dịch thực thi đồng thời nên dãy hành động có thể xảy ra nhƣ sau: T1: Read(X) T1: X:=X+2.000.000 T2: Read(X) T1: Write(X) T2: X:=X+100.000.000 T2: Write(X) T1: Commit T2: Commit

Trong trƣờng hợp này T2 đọc giá trị của X là 1.000.000. Giá trị này không

đúng bởi vì T2 đọc X trong khi giá trị nó đang đƣợc thay đổi từ 1.000.000 lên 3.000.000.

Khi kết thúc các giao dịch giá trị của X là 101.000.000 bởi vì hành động ghi

của T2 sẽ ghi đè lên kết quả ghi của T1.

Để khắc phục những vấn đề này ta phải xem xét về phương pháp điều khiển

tương tranh.

Khi một số giao dịch thực hiện đồng thời và có cạnh tranh một số khoản mục dữ liệu trong cơ sở dữ liệu đòi hỏi một tiến trình thực hiện đƣợc sinh ra bởi việc xử

lý đồng thời một tập các giao dịch, có một tác động tƣơng đƣơng với một tiến trình thực hiện tuần tự theo một thứ tự nào đó.

Một hệ thống đảm bảo tính chất này đƣợc gọi là đảm bảo tính khả tuần tự. Do đó, ở phần này mô hình đƣợc đƣa ra phân tích tính tuần tự, khả tuần tự các giao dịch với việc giải quyết tƣơng tranh .

3.1.1. Các khái niệm

Khóa chốt:

Khoá chốt là một cơ chế thƣờng dùng để giải quyết những vấn đề liên quan đến việc đồng bộ hoá dữ liệu truy cập dùng chung. Mỗi phần tử dữ liệu đều có một khoá kết hợp với chúng.

Bộ xếp lịch đảm bảo rằng chỉ duy nhất giao dịch có thể giữ khoá chốt trong một thời điểm, và chỉ có một giao dịch có thể truy xuất dữ liệu đó tại cùng một thời điểm.

Khoá chốt đƣợc bộ xếp lịch (schedule manager) dùng để đảm bảo tính khả tuần tự.

Trƣớc khi một giao dịch có thể truy cập dữ liệu dùng chung, bộ xếp lịch sẽ khảo sát trạng thái khoá chốt của những dữ liệu này.

 Nếu không có giao dịch nào khác đang giữ chúng thì bộ xếp lịch sẽ phát lệnh thông báo khoá dữ liệu này lại và sau đó các giao dịch thực hiện các lệnh của mình trên dữ liệu đó.

 Nếu dữ liệu đang bị khoá bởi giao dịch T2, thì giao dịch này phải chờ cho

đến khi nào T2 giải phóng khoá đó.

Có 2 loại khoá : khoá đọc (read lock) và khoá ghi (write lock). - read_locki(x): khoá đọc trên phần tử dữ liệu x của giao dịch Ti - write_lockj(x): khoá ghi trên phần tử dữ liệu x của giao dịch Tj

Hai khoá p_locki(x) và q_lockj(y) đụng độ nếu x=y, i≠j, có nghĩa rằng chúng khoá trên cùng một phần tử dữ liệu, chúng đƣợc phát sinh từ hai giao dịch khác nhau và một trong hai thao dịch là ghi.

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 không cần dùng đến khóa đó nữa thì sẽ giải phóng nó ra.

Ví dụ:

Có hai giao dịch 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ả.

Ta phải cân nhắc trong việc giữ khóa. Đây là ý tƣởng cơ bản của thuật toán khóa hai pha. (adsbygoogle = window.adsbygoogle || []).push({});

Một giao dịch đƣợc gọi là tuân thủ quy tắc khóa 2 pha nếu tất cả các thao tác khóa(read_lock, write_lock) đều phải đứng trƣớc thao tác unlock đầu tiên trong cùng giao dịch.

Khóa chết (Deadlock):

Khóa chết là khóa đƣợc nắm giữ bởi một giao dịch nhƣng giao dịch đó không thể truy cập đƣợc vào cơ sở dữ liệu tƣơng ứng.

Hiện tƣợng khóa chết xảy ra khi hàng đợi giao dịch có nhiều giao dịch đợi nhau: giao dịch này đợi 1 hoặc nhiều giao dịch khác giải phóng khóa trên cùng một mục dữ liệu.

Hình 3.1: Hiện tượng khóa chết (Deadlock)

Giao dịch T2 chờ khóa mục dữ liệu X đã bị T1 khóa, giao dịch T1 chờ khóa mục dữ liệu Y đã bị T1 khóa.

Để khắc phục tình trạng này:

 Thiết lập thời gian timeout, nếu thời gian thực hiện giao dịch vƣợt quá thời

gian timeout thì hủy bỏ giao dịch hoặc thực hiện thuật toán kiểm tra bế tắc.

 Sắp xếp các mục dữ liệu và truy xuất chúng theo một thứ tự nhất định.

 Giảm bớt việc đồng hành các giao dịch.

X Y T1 T2 Chờ khóa Đã khóa Đã khóa Chờ khóa

Nhãn thời gian:

Mỗi giao dịch đƣợc gán một mốc thời gian duy nhất vào lúc bắt đầu.

Cơ chế quản lý đồng hành theo nhãn thời gian không sử dụng bất kỳ khóa chốt nào.

Có thể xảy ra đụng độ giống deadlock.

Ví dụ: giao dịch yêu cầu đọc một đối tƣợng đã bị cập nhật bởi một giao dịch trƣớc đó, …

Nếu phát sinh đụng độ, thì khởi động lại giao dịch.Việc khởi động lại một giao dịch chịu ít chi phí hơn so với việc thực hiện rollback.

3.1.2

lƣu k

o

3.2 o dịch sau: X X. dịch 3.3). Giao dịch dịch dịch 1,500,000 $.

h 3.3

tất cả các

trên CSDL

3.2. Các kỹ thuật điều khiển tƣơng tranh

3.2.1. Các kỹ thuật đồng bộ hóa dựa trên khóa hai pha

Khóa hai pha (2PL-Two Phases Locking) đƣợc sử dụng để đồng bộ hóa việc đọc và ghi bằng cách phát hiện và ngăn chặn một cách dứt khoát các xung đột giữa các thao tác hiện hành. Trƣớc khi đọc mục dữ liệu x, một giao dịch phải sở hữu một khóa đọc (readlock) trên x. Trƣớc khi ghi lên x, nó phải sở hữu một khóa ghi (writelock) trên x. Quyền sở hữu các khóa bị chi phối bởi hai quy tắc:

(1): Các giao dịch khác nhau không thể đồng thời sở hữu các khóa xung đột. (2): Khi một giao dịch từ chối quyền sở hữu một khóa, nó không bao giờ có đƣợc khóa nào khác. (adsbygoogle = window.adsbygoogle || []).push({});

Định nghĩa khóa xung đột (conflicting lock) phụ thuộc vào loại đồng bộ hóa đang thực hiện: đối với đồng bộ hóa rw, hai khóa xung đột nhau nếu: (a) cả hai khoá đều thuộc về một mục dữ liệu và (b) khi một khóa là khóa đọc và khóa kia là khóa ghi; đối với đồng bộ hóa ww, hai khóa xung đột nhau khi: (a) cả hai khoá đều thuộc về một mục dữ liệu và (b) cả hai đều là khóa ghi.

Quy tắc thứ hai về quyền sở hữu khóa xuất phát từ nguyên nhân mọi giao dịch đều có khóa theo kiểu hai pha. Trong suốt quá trình phát triển pha, giao dịch thu đƣợc các khóa mà không cần phải giải phóng bất kỳ một khóa nào. Bằng cách giải phóng khóa, giao dịch chuyển sang pha co lại (shrinking phase). Trong suốt pha này, giao dịch giải phóng các khóa và quy tắc 2 ngăn chặn việc thu thận thêm khóa mới. Khi một giao dịch kết thúc (hoặc bị hỏng), mọi khóa còn lại tự động đƣợc giải phóng.

Trong các DDBMS các giao dịch đƣợc yêu cầu sở hữu mọi khóa trƣớc khi thực hiện và một số hệ thống cũng yêu cầu các giao dịch giữ lại mọi khóa cho đến khi kết thúc [3].

Khóa hai pha là một kỹ thuật đồng bộ chính xác, nghĩa là 2PL thu đƣợc một

quan hệ không vòng tròn rw( ww) khi dùng sự đồng bộ rw (ww). Thứ tự chuỗi

tuần tự thu đƣợc từ 2PL đƣợc xác định bởi trật tự các giao dịch sở hữu khóa. Khi một giao dịch sở hữu mọi khóa mà nó từng sở hữu, gọi là thời điểm khóa của giao

dịch. Cho E là một thực thi sử dụng 2PL để đồng bộ hóa rw (ww). Quan hệ rw

(ww) sinh ra bởi E đƣợc đồng nhất với quan hệ sinh ra bởi một chuỗi thực thi E‟

mà trong đó mọi giao dịch đều thực hiện thời điểm khóa của nó. Do đó, các điểm khóa của E xác định thứ tự tuần tự của E.

3.2.1.1. Quá trình thực hiện 2PL cơ bản

Quá trình thực hiện của 2PL thực chất là một quá trình lập lịch 2PL, một mô đun phần mềm sẽ nhận các khóa yêu cầu và khóa giải phóng đồng thời xử lý chúng theo chỉ định của 2PL.

Cách thực hiện 2PL cơ bản trong một cơ sở dữ liệu phân tán là phân bố lịch trình theo cơ sở dữ liệu, thay lịch trình đối với mục dữ liệu x tại DM mà x đƣợc lƣu lại. Trong sự thực hiện này, các khóa đọc sẽ đƣợc các lệnh dm-read và dm-write

yêu cầu, cũng có thể đƣợc các lệnh tiền ghi dữ liệu yêu cầu. Nếu khóa đƣợc yêu cầu không đƣợc cấp, thao tác đƣợc đƣa vào hàng đợi, dẫn tới tình trạng tắc nghẽn (deadlock). Các khóa ghi đƣợc giải phóng hoàn toàn bởi lệnh dm-write. Tuy nhiên, để giải phóng các khóa đọc, một thao tác giải phóng khóa đặc biệt đƣợc yêu cầu. Những quá trình giải phóng khóa này đƣợc thực hiện song song với lệnh dm-write, khi tín hiệu dm-write bắt đầu pha co lại. Khi một khóa đƣợc giải phóng, các thao tác trong hàng đợi của mục dữ liệu đƣợc xử lý theo thứ tự vào trƣớc ra trƣớc (FIFO).

Chú ý rằng quá trình thực hiện này tự động xử lý dữ liệu thừa một cách chính

xác. Giả sử mục dữ liệu logic X có các bản copy x1, …,xm. Nếu 2PL cơ bản đƣợc

dùng trong đồng bộ rw, một giao dịch có thể đọc bất cứ một bản copy nào và chỉ cần thu đƣợc một khóa đọc trên bản copy của X mà nó đọc thực sự. Tuy nhiên, nếu một giao dịch đƣợc cập nhật thì nó phải cập nhật mọi bản copy của X và do đó phải thu khóa ghi của tất cả các bản copy (dù 2PL cơ bản dùng có đƣợc cho đồng bộ rw hay ww hay không).

2PL là một trong những kỹ thuật hiệu quả trong việc khắc phục một số đụng độ cũng nhƣ thời gian chết trong quá trình thực hiện các lệnh của các giao dịch. Mỗi giao dịch phải yêu cầu một khóa S trƣớc khi đọc và một khóa X trƣớc khi ghi. Nếu không có sự đụng độ nào xảy ra, khóa có thể đƣợc cấp và giao dịch có thể thực hiện đƣợc, ngƣợc lại, giao dịch phải đợi đến khi sự đụng độ đƣợc gỡ bỏ. 2PL nhằm đồng bộ hoá việc đọc và ghi. Trƣớc khi đọc mục dữ liệu x, phải khóa x (khóa do đọc). Trƣớc khi ghi lên x, giao dịch phải khóa mục x (khóa do ghi).

Nhiệm vụ của bộ xếp lịch hai giai đoạn là quản lý khoá và điều khiển giao dịch khi nào lấy và khi nào giải phóng khoá.

Biểu đồ trên cho thấy bộ quản lý khoá giải phóng khoá ngay sau khi hoàn tất việc truy xuất. Điều này cho phép các giao dịch đang đợi khoá tiếp tục tiến hành và nhận khoá. Do vậy làm tăng hoạt động đồng thời.

2PL gồm hai giai đoạn:

Giai đoạn tăng trƣởng (growing phase), trong giai đoạn này giao dịch nhận các khoá và truy xuất các mục dữ liệu .

Giai đoạn thu hồi (shrinking phase) là giai đoạn giải phóng những khoá của giao dịch.

Điểm khoá (lock point) là thời điểm giao dịch đã nhận đƣợc tất cả các khoá nhƣng chƣa bắt đầu giải phóng khoá nào. Vì thế điểm khoá xác định cuối giai đoạn tăng trƣởng và đầu giai đoạn thu hồi của một giao dịch.

2PL đƣợc thiết kế cho các hệ thống CSDL tập trung: mỗi giao dịch nhận khóa chốt tại pha tăng trƣởng theo thứ tự. Trong các hệ phân tán, việc xác định điểm khóa là khó khăn vì ta không thể biết thời điểm pha tăng trƣởng kết thúc.

Trong 2PL, bộ SC sẽ gán tất cả các khóa trong pha tăng trưởng (Growing Phase) và giải phóng khóa trong pha thu hồi (Shrinking Phase).

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 dịch T

1 và T

2 , T

1 có thể ghi vào mục dữ liệu x trước T (adsbygoogle = window.adsbygoogle || []).push({});

2 và T

2 lại có thể ghi vào mục dữ liệu y trước T

1. 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ữ khóa để không có vấn đề gì xảy ra. Đây là ý tưởng 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 dịch 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 dịch Đƣợc phép chuyển sang 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ần thiết.

Chứng minh tính đúng đắn của thuật toán:

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 trƣớc T1 trên y. Vì vậy T1 giữ khóa trên x và liên hệ với khóa trên y.

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 y.

Điểm hạn chế của 2PL là:

+ 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 không thể biết thời điểm các giao dịch bắt đầu giải phóng khóa chốt. Ví dụ: thực hiện đồng thời hai giao dịch rút $100 chuyển $100 từ tài khoản:

Một phần của tài liệu tìm hiểu một số thuật toán điều khiển tương tranh trong cơ sở dữ liệu phân tán (Trang 34 - 77)