Đa hạt (Multiple Granularity)

Một phần của tài liệu Quản lý giao tác trong CSDL quan hệ và phân tán (Trang 82)

Trong các lược đồ điều khiển đồng thời được mô tả trước đây, ta đã sử dụng mục dữ liệu như đơn vị trên nó sự đồng bộ hoá được thực hiện. Tuy nhiên, có các hoàn cảnh trong đó việc nhóm một vài mục dữ liệu và xử lý chúng như một đơn vị đồng bộ hoá mang lại nhiều lợi ích. Nếu một giao tác Ti phải truy cập toàn bộ CSDL và giao thức khóa được sử dụng, khi đó Ti phải khóa mỗi mục dữ liệu trong CSDL. Như vậy việc thực hiện các khóa này sẽ tiêu tốn một thời gian đáng kể. Sẽ hiệu quả hơn nếu Ti chỉ cần một yêu cầu khóa để khóa toàn bộ CSDL. Mặt khác, nếu Ti cần truy cập chỉ một vài mục dữ liệu, nó không cần thiết phải khóa toàn bộ CSDL vì như vậy sẽ giảm tính đồng thời. Như vậy, cái mà ta cần là một cơ chế cho phép hệ thống xác định nhiều mức hạt. Một cơ chế như vậy là cho phép các mục dữ liệu có kích cỡ khác nhau và xác định một sự phân cấp các hạt dữ liệu, trong đó các hạt nhỏ được ẩn náu bên trong các hạt lớn. Sự phân cấp như vậy có thể được biểu diễn đồ thị như một cây. Một nút không là lá của cây đa hạt biểu diễn dữ liệu được kết hợp với con cháu của nó. Như một ví dụ minh hoạ, ta xét cây sau:

Nó gồm bốn mức nút. Mức cao nhất là toàn bộ CSDL. Thấp hơn là các nút kiểu vùng: CSDL bao gồm các vùng này. Mỗi vùng lại có các nút kiểu file như các con của nó, mỗi vùng chứa đúng các file này và không file nào nằm trong nhiều hơn một vùng. Cuối cùng, mỗi file có các nút con kiểu mẩu tin, không mẩu tin nào hiện diện trong hơn một file.[1]

Mỗi nút trong cây có thể được khóa một cách riêng lẻ. Như đã làm trong giao thức khóa hai kỳ, ta sẽ sử dụng các phương thức chốt shared

exclusive . Khi một giao tác khóa một nút, trong phương thức shared hoặc

exclusive, giao tác cũng khóa tất cả các nút con cháu của nút này ở cùng phương thức. Ví dụ Ti chốt tường minh file Fb ở phương thức exclusive, nó đã khóa ẩn tất cả các mẩu tin của Fb cũng trong phương thức exclusive.

Giả sử giao tác Tj muốn khóa mẩu tin Rb6của file Fb. Vì giao tác Ti đã khóa tường minh file Fb, mẩu tin Rb6 cũng bị khóa ẩn. Song làm thế nào để hệ thống biết được Tj có thể chốt Rb6 hay không: Tj phải duyệt cây từ gốc đến mẩu tin Rb6, nếu có một nút bất kỳ trên đường dẫn bị khóa ở phương thức không tương thích, Tj phải chờ. Bây giờ, nếu Tk muốn khóa toàn bộ CSDL, nó phải khóa nút gốc. Tuy nhiên, do Ti hiện đang giữ một khóa trên Fb, một bộ phận của cây, nên Tk sẽ không thành công. Vậy làm thế nào để hệ có thể khóa được nút gốc: Một khả năng là tìm kiếm trên toàn bộ cây, giải pháp này phá huỷ hoàn toàn lược đồ mục đích của lược đồ chốt đa hạt. Một giải pháp hiệu quả hơn là đưa vào một lớp mới các phương thức khóa, được gọi là phương thức khóa tăng cường (intension lock mode). Nếu một nút bị khóa ở phương thức tăng cường, khóa tường minh được tiến hành ở mức thấp hơn của cây (hạt nhỏ hơn). Khóa tăng cường được được đặt trên tất cả các cha của một nút trước khi nút đó được khóa tường minh. Như vậy một giao tác không cần thiết phải tìm kiếm toàn bộ cây để xác định nó có thể khóa một nút thành công hay không. Một giao tác muốn khóa một nút, chẳng hạn N, phải duyệt một đường

dẫn từ gốc đến N, trong khi duyệt cây, giao tác khóa các nút trên đường đi ở phương thức tăng cường.

Có một phương thức tăng cường kết hợp với phương thức shared và một với phương thức exclusive. Nếu một nút bị khóa ở phương thức tăng cường shared (IS), khóa tường minh được tiến hành ở mức thấp hơn trong cây, nhưng chỉ là một trong các khóa phương thức shared. Tương tự, nếu một nút bị khóa ở phương thức tăng cường exclusive (IX), khóa tường minh được tiến hành ở mức thấp hơn với các khóa exclusive hoặc shared. Nếu một nút bị khóa ở phương thức shared và phương thức tăng cường exclusive (SIX), cây con có gốc là nút này bị khóa tường minh ở phương thức shared và chốt tường minh được tiến hành ở mức thấp hơn với các khóa exclusive. Hàm tính tương thích đối với các phương thức khóa này được cho bởi ma trận [1]:

IS IX S SIX X

IS Yes Yes Yes Yes No

IX Yes Yes No No No

S Yes No Yes No No

SIX Yes No No No No

X No No No No No

Hình 2.7 Ma trận khóa tương thích đối với khóa đa hạt

Giao thức khóa đa hạt dưới đây đảm bảo tính khả tuần tự. Mỗi giao tác T có thể khóa một nút N theo các quy tắc sau [1,2]:

(1) Hàm tương thích khóa (dựa vào hình 2.8) phải được kiểm chứng (2) Gốc của cây phải được chốt đầu tiên, và có thể được chốt ở bất

(3) Một nút N có thể được khóa bởi T ở phương thức S hoặc IS chỉ khi cha của N hiện đang bị khóa bởi T ở hoặc phương thức IX hoặc phương thức IS.

(4) Một nút N có thể được khóa bởi T ở phương thức X, SIX hoặc IX chỉ khi cha của N hiện đang bị khóa ở hoặc phương thức IX hoặc phương thức SIX

(5) T có thể khóa một nút chỉ khi trước đó nó chưa mở khóa một nút nào (tuân theo giao thức 2PL).

(6) T có thể mở khóa một nút N chỉ khi không còn nút con nào của N hiện đang bị khóa bởi T

Ta thấy rằng, giao thức đa hạt yêu cầu các khóa được nhận theo thứ tự Top-Down và được mở theo thứ tự Bottom-Up.

CHƢƠNG 3: QUẢN LÝ GIAO TÁC TRONG SQL

Chương này trình bày một số kỹ thuật quản lý giao tác trong SQL thông qua một số ví dụ cụ thể. Khi làm việc với SQL trong chế độ tương tác, mỗi lênh SQL là một giao tác và giao tác kết thúc cùng với lệnh. Tuy nhiên khi viết chương trình với SQL nhúng hoặc chương trình sử dụng SQL/CLI hoặc JDBC, một giao tác là một tập lệnh và bắt đầu với lệnh SQL START TRANSACTION. Có hai cách để kết thúc một giao tác:

1. Lệnh SQL COMMIT: giao tác kết thúc một cách thành công. Mọi thay đổi của cơ sở dữ liệu do các lệnh trong giao tác gây ra sẽ được lưu giữ lại. Trước khi thực hiện lệnh COMMIT, các thay đổi của cơ sở dữ liệu là “không nhìn thấy được” đối với các giao tác khác

2. Lệnh SQL ROLLBACK: Giao tác kết thúc không thành công (hay bị bỏ dở). Mọi thay đổi do các lệnh SQL của giao tác gây ra là không thực hiện được (tức là chúng được ROLLBACK), và không còn xuất hiện trong CSDL.

Ví dụ, xét hàm transfer( ) thực hiện chuyển một khoản tiền từ tài khoản này sang tài khoản khác. Đây là một chương trình SQL trong C++, để đơn giản ta bỏ qua các lệnh C như các lệnh đưa vào, đưa ra...

1) EXEC SQL BEGIN DECLARE SECTION; 2) int acct1, acct2; /* 2 toài khoản*/

3) int balance1; /*Số lượng tiền trong tài khoản thứ nhất*/ 4) int amount; /*Số tiền cần chuyển*/

5) EXEC SQL END DECLARE SECTION; 6) void transfer() {

7) /* đoạn mã C để nhắc người dùng nhập vào tài khoản 1 và 2 và số tiền cần chuyển, theo các biến acct1, acct2 và amount*/ 8) EXEC SQL SELECT balance INTO :balance1

9) FROM Accounts

10) WHERE AcctNo = :acct1; 11) if (balance1 > amount) {

12) EXEC SQL UPDATE Accounts

13) SET balance = balance + :amount

14) WHERE acctNo = :acct2;

15) EXEC SQL UPDATE Accounts

16) SET balance = balance - :amount

17) WHERE acctNo = :acct1;

}

18) else /* Đoạn mã C in ra thông báo cho người dùng biết là không có đủ tiền trong tài khoản để thực hiện chuyển tiền */

}

Nếu coi chương trình này như một giao tác thì ta đưa thêm một dòng lệnh EXEC SQL START TRANSACTION vào trước dòng 8, khi bắt đầu đọc số dư của tài khoản thứ nhất. Nếu kiểm tra ở dòng 11 là đúng và thực hiện chuyển tiền thì chúng ta cần ghi lại các thay đổi đã được làm thi ta đưa thêm lệnh EXEC SQL COMMIT vào sau lệnh ở dòng 17. Nếu kiểm tra ở dòng 11 là sai (tức là không có đủ tiền để chuyển) thì giao tác phải được huỷ bỏ. Như vậy, ta sẽ thêm vào lệnh EXEC SQL ROLLBACK sau dòng 18. Với việc đưa vào các dòng lệnh như vậy, những thay đổi trong cơ sở dữ liệu (tài khoản 1 được trừ tiền đi, tài khoản 2 được cộng thêm tiền vào) sẽ được lưu vào cơ sở dữ liệu.

Bây giờ chúng ta xét một số kỹ thuật trong việc điều khiển tính tuần tự, tính nguyên tử, .. trong SQL.

Một phần của tài liệu Quản lý giao tác trong CSDL quan hệ và phân tán (Trang 82)

Tải bản đầy đủ (PDF)

(96 trang)