Các kỹ thuật điều khiển tương tranh bằng khóa

Một phần của tài liệu Giáo trình Cơ sở dữ liệu 2 Phần 1 - ĐH Thái Nguyên (Trang 66)

- Các thuật toán dựa trên nối nửa

4) Tính bền vững

1.5.3. Các kỹ thuật điều khiển tương tranh bằng khóa

y Khoá

Khoá (Lock) là một đặc quyền của một giao dịch được bộ quản lý khoá trao cho để có thể truy cập trên một mục dữ liệu. Hay khoá là một biến gắn với một mục dữ liệu trong cơ sở dữ liệu để biểu diễn trạng thái của một mục dữ liệu này trong mối liên quan đến thao tác thực hiện trên đó. Bộ quản lý khoá cũng có thể thu hồi lại khoá này. Tại một thời điểm, mục dữ liệu X có một trong 3 trạng thái:

- Có khoá đọc (read-lock)( còn gọi là khoá chia sẻ - shared lách): chỉ cho phép một giao dịch đọc một mục nhưng không được cập nhật trên mục này.

- Có khoá ghi (wrire-lock) ( còn gọi là khoá độc quyền - exclusive lách) : cho phép thực hiện cả hai thao tác đọc ghi.

- Không có khoá.

Các khoá dược sử dụng theo cách sau:

+ Bất kỳ một giao dịch nào cần truy cập vào một mục dữ liệu trước hết phải khoá mục dữ liệu đó lại. Giao dịch sẽ yêu cầu một khoá đọc nếu chỉ cần đọc dữ liệu và yêu cầu khoá ghi nếu vừa cần đọc và cần ghi dữ liệu.

+ Nếu mục dữ liệu đó chưa bị khoá bởi một giao dịch nào khác thì khoá sẽ được cấp phát theo đúng yêu cầu.

+ Nếu mục dữ liệu đó đang bị khoá, HQT CSDL sẽ xác định xem khoá được yêu cầu có mương thích với khoá hiện hành hay không. Khi một giao dịch yêu cầu cấp một khoá đọc cho nó trên một mục dữ liệu mà trên mục đó đang có một khoá đọc (của giao dịch khác) thì khoá yêu cầu này được cấp phát. Trong

trường hợp khoá yêu cầu là khoá ghi thì giao dịch yêu cầu khoá sẽ phải chờ cho đến khi khoá hiện hành được giải phóng mới được cấp khoá.

+ Một giao dịch tiếp tục giữ một khoá cho đến thời điểm khoá đó được giải phóng, thời điểm này hoặc nằm trong quá trình thực hiện giao dịch hoặc là thời điểm giao dịch được chuyển giao hay bị huỷ bỏ. Chỉ khi khoá ghi được giải phóng thì kết quả cua thao tác ghi mới thấy được đối với các giao dịch khác. Một số hệ thống còn cho phép giao dịch đưa các khoá đọc trên một mục dữ liệu và sau đó nâng cấp khoá lên thành khoá ghi. Điều này cho phép một giao dịch kiểm tra dữ liệu trước, sau đó mới quyết định có cập nhật hay không.

Bộ quản lý khoá lưu các khoá trong một bảng khoá (lock table).

Khi điều khiển các hoạt động tương tranh bằng khoá, có thể xảy ra các tình huống:

Khoá sống (live-lock) là tình huống mà một giao dịch yêu cầu khoá trên một mục mà chẳng bao giờ nhận được khoá trong khi luôn có một giao dịch khác giữ khoá trên mục này (khoá sống trên mục A của giao dịch T là khoá không khoá được A vì A luôn bị khoá bởi một giao dịch khác), mặc dù có một số lần giao dịch này có cơ hội nhận khoá trên mục đó. Rất nhiều giải pháp đã được các nhà thiết kế hệ điều hành đề xuất vấn đề giải quyết khoá sống. Có thể sử dụng một chiến lược đơn giản đến trước, phục vụ trước" để loại bỏ được khoá sống.

Bế tắc hay khoá gài (deadlock) là tình huống mà trong đó mỗi giao dịch trong một tập hay nhiều giao dịch đang đợi nhận khoá của một mục hiền đang bị khoá bởi một giao dịch khác trong một tập giao. địch đó và ngược lại (một mục trong giao dịch này bị gài bởi giao dịch khác và ngược lại).

Ví dụ Giả sử có hai giao dịch đồng thời Tl và T2 như sau: Tl : Lock A ; Lock B ; Unlock A ; Unlock B;

T2 : Lock B ; Lock A ; Unlock B ; Unlock A;

Tl và T2 cùng có thể thực hiện một số tác vụ nào đó trên A và B. Giả sử Tl và T2 được thực hiện cùng lúc. Tl yêu cầu và được trao khoá trên A, còn T2 yêu cầu và được trao khoá trên B. Do đó khi Tl yêu cầu khoá trên B nó sẽ phải đợi vì T2 đã khoá B. Tương tự T2 yêu cầu khoá trên A nó sẽ phải đợi vì Tl đã khoá A. Kết quả là không một giao dịch nào tiếp tục hoạt động được: mỗi giao dịch đều phải đợi giao dịch kia mở khoá, và chúng đều phải đợi nhưng chẳng bao giờ nhận được khoá như yêu cầu.

Để tránh bế tắc có thể sử dụng các giải pháp:

bộ quản lý khoá trao tất cả các khoá cho chúng nếu được, hoặc không trao và cho giao dịch này đợi nếu một hay nhiều khoá được yêu cầu đang bị giữ bởi một giao dịch khác.

(ii) Gán một thứ tự tuyên tính cho các mục và yêu cầu tất cả các giao dịch phải xin khoá theo đúng thứ tự này.

(iii) Cách khác để xử lý bế tắc là định kỳ kiểm tra yêu cầu khoá và phát hiện có xảy ra bế tắc không. Bằng cách dùng đổ thị chờ, với các nút biểu diễn các giao dịch và các cung Ti ´ Tj biểu thị Tj đang đợi nhận khoá trên một mục đang được Ti giữ. Nếu trong đồ thị có chu trình, sự bế tắc sẽ xảy ra và nếu không có chu trình thì kết luận không có khoá gài hay bế tắc. Nếu một khoá gài bị phát hiện, khi đó hệ thống sẽ buộc một trong các giao dịch bị bế tắc phải khởi động lại và tác dụng của giao dịch đó trên cơ sở dữ liệu phải được hoàn toàn trả lại.

Một phần của tài liệu Giáo trình Cơ sở dữ liệu 2 Phần 1 - ĐH Thái Nguyên (Trang 66)