6. Cấu trúc luận văn
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
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 và chuyển $100 từ tài khoản: