« Home « Kết quả tìm kiếm

Quản Lý Dữ Liệu - Cơ Sở Dữ Liệu phần 8


Tóm tắt Xem thử

- Bây giờ giả sử rằng tháo khóa bị làm trễ đến cuối giao dịch.
- Giao dịch T 3 tương ứng với T 1 với tháo khóa bị làm trễ được định nghĩa như sau:.
- Giao dịch T 4 tương ứng với T 2 với tháo khóa bị làm trễ được xác định như sau:.
- Ta gặp phải tình huống trong đó T 3 chờ đợi T 4 đồng thời T 4 chờ đợi T 3 , một sự chờ đợi vòng tròn, và như vậy không giao dịch nào có thể tiến triển.
- Khi tình huống khóa chết xảy ra hệ thống buộc phải cuộn lại một trong các giao dịch.
- Mỗi khi một giao dịch bị cuộn lại, các mục dữ liệu bị khóa bởi giao dịch phải được tháo khóa và nó trở nên sẵn có cho giao dịch khác, như vậy các giao dịch này có thể tiếp tục được sự thực hiện của nó..
- Nếu ta không sử dụng khóa hoặc tháo khóa mục dữ liệu ngay khi có thể sau đọc hoặc viết mục, ta có thể rơi vào trạng thái không nhất quán.
- Mặt khác, nếu ta không tháo khóa một mục dữ liệu trước khi yêu cầu một khóa trên một mục dữ liệu khác, deadlock có thể xảy ra.
- Deadlock được ưa thích hơn trạng thái không nhất quán vì chúng có thể điều khiển được bằng cách cuộn lại các giao dịch trong khi đó trạng thái không nhất quán có thể dẫn đến các vấn đề thực tế mà hệ CSDL không thể điều khiển..
- T n } một tập các giao dịch tham gia vào thời lịch S.
- Ta nói T i đi trước T j trong S, và được viết là T i → T j , nếu tồn tại một mục dữ liệu Q sao cho T i giữ.
- Khi một giao dịch T i yêu cầu một khóa trên một mục dữ liệu Q ở phương thức M, khóa sẽ được cấp nếu các điều kiện sau được thỏa mãn:.
- (i) Không có giao dịch khác đang giữ một khóa trên Q ở phương thức xung đột với M..
- (ii) Không có một giao dịch nào đang chờ được cấp một khóa trên M và đã đưa ra yêu cầu về khóa trước T i.
- Nghi thức này yêu cầu mỗi một giao dịch phát ra yêu cầu khóa và tháo khóa qua hai giai đoạn:.
- Giai đoạn tăng trưởng (Growing phase): một giao dịch có thể nhận được các khóa, nhưng nó không thể tháo bất kỳ khóa nào..
- Giai đoạn thu hẹp (Shrinking phase): một giao dịch có thể tháo các khóa nhưng không thể nhận được một khóa mới nào..
- Khởi đầu, một giao dịch ở giai đoạn tăng trưởng.
- Giao dịch được cấp các khóa cần thiết.
- Mỗi khi giao dịch tháo một khóa, nó đi vào giai đoạn thu hẹp và nó không thể phát ra bất kỳ một yêu cầu khóa nào nữa.
- Các giao dịch T 3 và T 4 là hai kỳ.
- Các giao dịch T 1 và T 2 không là hai kỳ.
- Một giao dịch T muốn đọc (sửa) mục dữ liệu Q nó phải yêu cầu cấp khóa Shared (Exclusive) trên Q..
- Tất cả các khóa do một giao dịch đang nắm giữ được giải phóng khi giao dịch được bàn giao..
- Một giao dịch thử nâng cấp một khóa trên một mục dữ liệu Q có thể phải chờ.
- lock-S(Q): yêu cầu một khóa shared trên mục dữ liệu Q..
- lock-X(Q): yêu cầu một khóa exclusive trên mục dữ liệu Q..
- unlock(Q): thu hồi (giải phóng, tháo) khóa trên mục dữ liệu Q..
- Ta xét một ví dụ: Các giao dịch T 8 và T 9 được nêu trong ví dụ chỉ được trình bày bởi các hoạt động ý nghĩa là Read và Write..
- Bởi vậy, sự thực hiện tương tranh của hai giao dịch trở thành thực hiện tuần tự..
- Chú ý rằng một giao dịch thử cập nhật một khóa trên một mục dữ liệu Q có thể buộc phải chờ.
- Việc chờ bắt buộc này xảy ra khi Q đang bị khóa bởi giao dịch khác ở phương thức shared..
- Nghi thức khóa hai kỳ với chuyển đổi khóa chỉ sinh ra các thời lịch khả tuần tự xung đột, các giao dịch có thể được tuần tự hoá bởi các điểm khóa của chúng.
- Trong hệ quản trị CSDL, các khóa của các giao dịch được quản lý bởi bộ phận quản lý khóa (lock manager) thông qua bảng khóa (lock table).
- chứa các thông tin: số lượng giao dịch đang giữ khóa trên đối tượng này (số lượng giao dịch có thể >.
- Khi một giao dịch T i cần một khóa trên một mục dữ liệu Q, nó gửi một yêu cầu cấp khóa đến bộ quản lý khóa, yêu cầu được xử lý như sau:.
- Nếu yêu cầu một khóa Shared, hàng đợi các yêu cầu của mục Q là rỗng và mục dữ liệu Q không bị khóa theo phương thức Exclusive thì bộ phận quản lý khóa cấp khóa cho giao dịch T i và cập nhật lại thông tin trên bảng khóa..
- Nếu yêu cầu một khóa Exclusive và không có giao dịch nào đang giữ khóa trên Q thì bộ phận quản lý khóa cấp khóa cho giao dịch T i và cập nhật lại thông tin trên bảng khóa..
- Ngược lại, thêm yêu cầu này vào hàng đợi khóa của mục dữ liệu Q và giao dịch T i tạm thời ngưng..
- Khi giao dịch được bàn giao hoặc bị bỏ dở, nó phải tháo tất cả các khóa nó đang nắm giữ.
- Một hệ thống ở trạng thái deadlock nếu tồn tại một tập hợp các giao dịch sao cho mỗi giao dịch trong tập hợp đang chờ một giao dịch khác trong tập hợp.
- Chính xác hơn, tồn tại một tập các giao dịch { T 0 , T 1.
- T n } sao cho T 0 đang chờ một mục dữ liệu được giữ bởi T 1 , T 1 đang chờ một mục dữ liệu đang bị chiếm bởi T 2.
- T n-1 đang chờ một mục dữ liệu được giữ bởi T n và T n đang chờ một mục T 0 đang chiếm.
- Không một giao dịch nào có thể tiến triển được trong tình huống như vậy.
- Một cách xử lý tình huống này là cuộn lại một vài giao dịch tham gia vào deadlock..
- Cả hai phương pháp đều có thể dẫn đến việc cuộn lại giao dịch..
- Với thứ tự ưu tiên, một giao dịch T 2 yêu cầu một khóa bị giữ bởi giao dịch T 1 , khóa đã cấp cho T 1 có thể bị lấy lại và cấp cho T 2 , T 1 bị cuộn lại.
- Để điều khiển ưu tiên, ta gán một nhãn thời gian duy nhất cho mỗi giao dịch.
- Hệ thống sử dụng các nhãn thời gian này để quyết định một giao dịch phải chờ hay cuộn lại.
- Nếu một giao dịch bị cuộn lại, nó vẫn giữ nhãn thời gian cũ của nó khi tái khởi động.
- Khi giao dịch T i yêu cầu một mục dữ liệu bị chiếm bởi T j , T i được phép chờ chỉ nếu nó có nhãn thời gian nhỏ hơn của T j nếu không T i bị cuộn lại (die)..
- Khi giao dịch T i yêu cầu một mục dữ liệu hiện đang bị giữ bởi T j , T i được phép chờ chỉ nếu nó có nhãn thời gian lớn hơn của T j , nếu không T j bị cuộn lại (Wounded)..
- Một điều quan trọng là phải đảm bảo rằng, mỗi khi giao dịch bị cuộn lại, nó không bị.
- Cả hai sơ đồ Wound-Wait và Wait-Die đều tránh được sự chết đói: tại một thời điểm, có một giao dịch với nhãn thời gian nhỏ nhất.
- Giao dịch này không thể bị yêu cầu cuộn lại trong cả hai sơ đồ.
- Do nhãn thời gian luôn tăng và do các giao dịch không được gán nhãn.
- thời gian mới khi chúng bị cuộn lại, một giao dịch bị cuộn lại sẽ có nhãn thời gian nhỏ nhất (vào thời gian sau) và sẽ không bị cuộn lại lần nữa..
- Trong sơ đồ Wait-Die, một giao dịch già hơn phải chờ một giao dịch trẻ hơn giải phóng mục dữ liệu.
- Như vậy, giao dịch già hơn có xu hướng bị chờ nhiều hơn.
- Ngược lại, trong sơ đồ Wound-Wait, một giao dịch già hơn không bao giờ phải chờ một giao dịch trẻ hơn..
- Trong sơ đồ Wait-Die, nếu một giao dịch T i chết và bị cuộn lại vì nó đòi hỏi một mục dữ liệu bị giữ bởi giao dịch T j , khi đó T i có thể phải tái phát ra cùng dãy các yêu cầu khi nó khởi động lại.
- Nếu mục dữ liệu vẫn bị chiếm bởi T j , T i bị chết lần nữa.
- Như vậy, T i có thể bị chết vài lần trước khi nhận được mục dữ liệu cần thiết.
- Trong sơ đồ Wound-Wait, giao dịch T i bị thương và bị cuộn lại do T j yêu cầu mục dữ liệu nó chiếm giữ.
- Trong cách tiếp cận này, một giao dịch đã yêu cầu một khóa phải chờ nhiều nhất một khoảng thời gian xác định.
- Nếu khóa không được cấp trong khoảng thời gian này, giao dịch được gọi là mãn kỳ (time out), giao dịch tự cuộn lại và khởi động lại.
- Nếu có một deadlock, một hoặc một vài giao dịch dính líu đến deadlock sẽ time out và cuộn lại, để các giao dịch khác tiến triển.
- Sơ đồ timeout dễ thực thi và hoạt động tốt nếu giao dịch ngắn và nếu sự chờ đợi lâu là do deadlock.
- Duy trì thông tin về sự cấp phát hiện hành các mục dữ liệu cho các giao dịch cũng như các yêu cầu mục dữ liệu chưa được giải quyết..
- Tập các đỉnh gồm tất cả các giao dịch trong hệ thống.
- i chờ T j giải phóng một mục dữ liệu nó cần..
- Khi giao dịch T i yêu cầu một mục dữ liệu đang bị giữ bởi giao dịch T j khi đó cung T i →T j được thêm vào đồ thị.
- Cạnh này bị xoá đi chỉ khi giao dịch T j không còn giữ mục dữ liệu nào mà T i cần..
- Mỗi giao dịch tham gia vào chu trình này được gọi là bị deadlock.
- Bao nhiêu giao dịch sẽ bị ảnh hưởng bởi deadlock?.
- Các mục dữ liệu được cấp cho các giao dịch bị deadlock sẽ không sẵn dùng cho các giao dịch khác đến khi deadlock bị phá vỡ.
- Giải pháp chung nhất là cuộn lại một vài giao dịch để phá vỡ deadlock..
- Đã cho một tập các giao dịch bị deadlock, ta phải xác định giao dịch nào phải cuộn lại để phá vỡ deadlock.
- Ta sẽ cuộn lại các giao dịch sao cho giá phải trả là tối thiểu.
- Giao dịch đã tính toán được bao lâu và bao lâu nữa..
- Giao dịch đã sử dụng bao nhiêu mục dữ liệu..
- Giao dịch cần bao nhiêu mục dữ liệu nữa để hoàn tất..
- Bao nhiêu giao dịch bị cuộn lại..
- Cuộn lại (Rollback).
- Mỗi khi ta đã quyết định được giao dịch nào phải bị cuộn lại, ta phải xác định giao dịch này bị cuộn lại bao xa.
- Giải pháp đơn giản nhất là cuộn lại toàn bộ: bỏ dở giao dịch và bắt đầu lại nó.
- Tuy nhiên, sẽ là hiệu quả hơn nếu chỉ cuộn lại giao dịch đủ xa như cần thiết để phá vỡ deadlock.
- Nhưng phương pháp này đòi hỏi hệ thống phải duy trì các thông tin bổ sung về trạng thái của tất cả các giao dịch đang chạy..
- Trong một hệ thống trong đó việc chọn nạn nhân dựa trên các nhân tố giá, có thể xảy ra là một giao dịch luôn là nạn nhân của việc chọn này và kết quả là giao dịch này không bao giờ có thể hoàn thành.
- Một giải pháp xem số lần bị cuộn lại của một giao dịch như một nhân tố về giá..
- LẬP TRÌNH CƠ SỞ DỮ LIỆU.
- Có thể xem DataSet như là một cấu trúc dữ liệu để lưu trữ dữ liệu trong bộ nhớ chính.
- Đọc dữ liệu.
- dữ liệu (không cần đến datatable hay dataset)..
- Như đã nói ở trên, ta có thể sử dụng DataAdapter như là một cầu nối để lấy dữ liệu từ CSDL vào Dataset.
- Ta có thể định nghĩa hoặc không định nghĩa trước bảng (đối tượng DataTable) và cấu trúc của bảng sẽ nhận dữ liệu.
- Phương thức Fill có thể được gọi mà không cần mở kết nối trước, trong trường hợp này, kết nối tương ứng sẽ được mở và đóng lại ngay sau khi thực hiện xong việc lấy dữ liệu..
- Lưu ý: Trong trường hợp ta muốn dữ liệu đưa vào đối tượng DataTable thỏa ràng buộc khóa chính (tự động loại bỏ dữ liệu trùng trên khóa chính nếu có), ta có thể thiết lập thuộc tính MissingSchemaAction của đối tượng DataAdapter là AddWithKey.
- Ghi dữ liệu

Xem thử không khả dụng, vui lòng xem tại trang nguồn
hoặc xem Tóm tắt