Khái niệm lịch biểu: Lịch biểu của một giao dịch là một chuỗi các lệnh được thực hiện trong hệ thống theo thứ tự thời gian.. Một lịch biểu đối với một tập các giao dịch phải bao gồm tất
Trang 1ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH
CHƯƠNG TRÌNH ĐÀO TẠO THẠC SĨ CNTT QUA MẠNG
KHÓA 2
oOo
BÁO CÁO THU HOẠCH MÔN HỌC
CƠ SỞ DỮ LIỆU NÂNG CAO
ĐỀ TÀI:
NGHIÊN CỨU XỬ LÝ ĐỒNG HÀNH TRONG CƠ SỞ DỮ LIỆU PHÂN TÁN
VÀ ỨNG DỤNG XÂY DỰNG CHƯƠNG TRÌNH DEMO MÁY RÚT TIỀN TỰ ĐỘNG ĐA NGÂN HÀNG
Giảng viên phụ trách: TS Đỗ Phúc
Nhóm sinh viên thực hiện:
Nguyễn Nam Hải – CH0403005 Phan Nhựt Long – CH0403009 Phan Thanh Nam – CH0403011
Trang 2Xin chân thành cảm ơn!
Trang 31 Cơ sở dữ liệu phân tán (CSDLPT)
Trong định nghĩa trên có hai điểm quan trọng là:
; Phân tán: dữ liệu có sự độc lập vị trí, người sử dụng không biết nơi lưu trữ CSDL
và có thể di chuyển dữ liệu từ vị trí vật lý này đến vị trí vật lý khác mà không ảnh hưởng đến người dùng khác
; Tương quan logic: dữ liệu có một số thuộc tính ràng buộc chúng với nhau, điều này
có thể giúp ta phân biệt được CSDLPT với một tập hợp các CSDL cục bộ hoặc các tập tin CSDL lưu giữ tại các vị trí khác nhau trên một mạng máy tính
Ngày nay, tầm quan trọng của CSDLPT là không thể phủ nhận và các lý do chính yếu
để giải thích tại sao lại cần sử dụng và phát triển CSDLPT là:
; Nguyên nhân về tổ chức và kinh tế: Các tổ chức, đặc biệt là các tổ chức kinh tế lớn thường có khuynh hướng mở rộng địa bàn hoạt động (mở các chi nhánh mới) nhưng vẫn phải đảm bảo tính thông suốt và nhất quán của hệ thống CSDL
; Sự liên kết các CSDL đang tồn tại: CSDLPT là giải pháp tự nhiên khi có các CSDL đang tồn tại và sự cần thiết xây dựng một ứng dụng toàn cục Trong trường hợp này CSDLPT được làm từ dưới lên (bottom-up) từ các CSDL đã tồn tại từ trước Tiến trình này có thể đòi hởi phải cấu trúc lại một cách cục bộ ở một mức độ nhất định Nhưng dù sao những sửa đổi này vẫn nhỏ hơn nhiều so với việc tạo lập một CSDL tập trung hoàn toàn mới
; CSDLPT cho phép mỗi vị trí lưu giữ CSDL riêng nhằm hỗ trợ truy cập hiệu quả và tức thì các dữ liệu được dùng thường xuyên Các dữ liệu này vẫn có thể được dùng ở những nơi khác nhưng có tần suất sử dụng ít hơn
; Nếu có sự cố hư hỏng máy tính cục bộ hoặc đường liên lạc bị sụp đổ thì phần còn lại của mạng vẫn tiếp tục làm việc được
; Làm giảm tổng chi phí tìm kiếm
; Tính tin cậy và sẵn sàng cao
b Thuận lợi của CSDLPT:
; Khả năng phục hồi nhanh chóng (Resilience): việc truy cập dữ liệu không phụ thuộc vào một máy tính hay một đường kết nối trên mạng Nếu có bất kỳ một lỗi nào xảy ra thì sẽ có một vài CSDL được truy cập trên các nút cục bộ khác, hơn nữa, nếu có lỗi xảy ra trên đường kết nối thì có thể đường nối dữ liệu khác được chọn thay thế
; Giảm dòng dữ liệu trên đường truyền đồng thời tăng khả năng trả lời
; “Trong suốt vị trí” cho phép dữ liệu vật lý di chuyển mà không cần thay đổi ứng dụng hay thông báo cho người sử dụng
; Cách thức mở rộng dễ dàng: dễ dàng phát triển, mở rộng và điều này là nhờ vào:
Ö Nhiều bộ xử lý có thể được thêm vào mạng;
Ö Nhiều CSDL có thể được thêm vào trên một nút mạng;
Ö Cập nhật phần mềm độc lập với cấu trúc vật lý
c Bất lợi của CSDLPT:
Trang 4; Phí tổn gây ra bởi các tác vụ điều khiển và phối hợp có thể làm giảm đáng kể hiệu
năng
; Một khi dữ liệu được sao lưu ở nhiều vị trí khác nhau sẽ dẫn đén việc gia tăng các
tài nguyên cần sử dụng nhằm đảm bảo cập nhật đồng thời và nhất quán; việc sao lưu cần thêm
không gian lưu trữ
; Vấn đề bảo đảm an toàn phức tạp hơn
; Khó khăn trong việc thay đổi: hiện nay chưa có một công cụ hoặc phương pháp nào
tối ưu để trợ giúp người sử dụng có thể chuyển đổi dữ liệu từ tập trung sang phân tán và
ngược lại
d các thành phần của CSDLPT:
DB
Computer Network
DC = Truyền dữ liệu Communications GSC
= Global Systems Catalog DDBMS = Hệ QTCSDLPT
DDBMS
DC
Trang 52 Giao tác (Transaction)
a Khái niệm giao tác
Giao tác là một chuỗi lệnh thực hiện trên các đối tượng dữ liệu (các dòng - tuples, cột- fields) trong một hệ cơ sở dữ liệu (CSDL) Các lệnh của giao tác bao gồm:
• Các lệnh thực hiện:
- Read(): Đọc dữ liệu từ CSDL và trả về giá trị phần tử được lưu trong CSDL
- Write(): Lưu giá trị của phần tử vào CSDL
• Các lệnh giao tác:
- Start(): Bắt đầu thực hiện một giao tác
- Commit(): Kết thúc thành công một giao tác
- Abort(): Hủy bỏ một giao tác
Hình thức hóa khái niệm giao tác như sau:
Gọi Oij(x) là lệnh Oj của giao tác Ti truy xuất trên cùng mục dữ liệu x, trong đó:
Oj∈{Read,Write} và lệnh Oj là nguyên tử (không phân chia được)
- Đối với các lệnh đọc Rij(x) và Rik(x) có thể được thực hiện cùng một lúc
- Với tất cả Oij(x)∈OSi thì Oij<jNi (Bất kỳ lệnh Oj nào cũng thực hiện trước lệnh Ni
b Thuộc tính giao tác
Nguyên tố (Atomicity)
- Nguyên tắc “được ăn cả, ngã về không”:
+ Một giao tác kết thúc thành công (gọi lệnh Commit) sau khi hoàn tất những lệnh của nó Nếu người sử dụng được báo là đã kết thúc thành công một giao tác thì họ sẽ chắc chắn rằng những thay đổi được thực hiện bởi giao tác sẽ được cập nhật trên CSDL
+ Một giao tác có thể bị hủy bỏ (gọi lệnh Abort) sau khi thực hiện vài lệnh Trong trường hợp này, CSDL phục hồi lại các thay đổi dữ liệu
do các lệnh đó thực hiện Lệnh Abort() được gọi có thể do nguyên nhân phía người dùng hoặc hệ thống phát sinh lỗi Lệnh này cũng được gọi để loại trừ những kết quả chưa hoàn thiện
- Một giao tác thường bao gồm một số lệnh được thực hiện tại những thời điểm khác nhau
Trang 6- Nếu site bị đổ (crashes), những giao tác đang còn dở dang sẽ được phục hồi lại ban đầu
Nhất quán (consistency)
- Mỗi giao tác phải bảo toàn sự nhất quán dữ liệu
- Hình thức nhất quán dữ liệu có thể được thực hiện bởi hệ thống thông qua ràng buộc toàn vẹn
- Ràng buộc toàn vẹn hoạt động như bộ lọc, xác định rằng một giao tác được chấp nhận hay không
Cô lập (isolation)
- Khi người sử dụng gửi đi các giao tác, mỗi giao tác được thực hiện bởi chính
nó, không để lộ kết quả của nó cho những giao tác khác cùng hoạt động trước khi nó kết thúc
- Đảm bảo cho mọi kết quả luôn luôn đúng, thậm chí khi có nhiều giao tác được thực hiện đồng thời trên cùng một mục dữ liệu
- Các kết quả từ việc xử lý giao tác đồng hành cũng giống từ việc xử lý giao tác nối tiếp
- Tuân theo giao thức xử lý đồng hành
Bền vững (durability)
- Đảm bảo một giao tác khi kết thúc, kết quả của chúng được duy trì và không bị xóa khỏi CSDL Vì thế, DBMS đảm bảo rằng kết quả giao tác luôn tồn tại dù xảy ra sự cố hệ thống, bằng cách:
+ Phục hồi những thay đổi trên đĩa tại thời điểm kết thúc giao tác
+ Ghi lại những thay đổi vào một file log trên đĩa và tại thời điểm bắt đầu lại, đọc file log này và phục hồi lại những thay đổi trước đó của giao tác + Trường hợp đĩa bị lỗi, dữ liệu được phục hồi từ dữ liệu sao lưu dự phòng, đĩa mirror,
c Ví dụ
- Giả sử rằng 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
- Công việc cần thực hiện là chuyển tiền từ tài khoản của một ngân hàng sang một tài khoản của một ngân hàng khác
input(fromaccount, toaccount, amount);
/’ This procedure transfers “amount” from “fromaccount” into
“toaccount.’ ”
temp : = Read(Accounts[fromaccount]);
Trang 7if temp < amount then
begin output( “insufficient funds”);
Abort;
end else
X là số dư của tải khoản người chuyển tiền, A là số tiền được chuyển
Y là số dư của tải khoản người nhận
- Giả sử AccountID =’00001’ có số tiền hiện tại là 1.000.000 đồng
- Nếu đồng thời có hai khách hành muốn chuyển vào tài khoản này, khách thứ nhất muốn chuyển vào 1.000.000 đồng và khách thứ hai là 100.000.000 đồng
- Giả sử các giao tác thực thi của procedure Deposit như sau:
Trang 8Read1(Accounts[ ‘00001’]) trả về 1.000.000 đồng Read2(Accounts[‘00001’]) returns the value 1.000.000 đồng Write2(Accounts[‘00001’], 101.000.000 dong)
Commit2 Write1(Accounts[‘00001’], 2.000.000) Commit1
- Câu hỏi đặt ra là sau khi chuỗi giao tác này kết thúc thì số tiền hiện có trong tài khoản là bao nhiêu?
3 Lịch biểu:
a Khái niệm lịch biểu:
Lịch biểu của một giao dịch là một chuỗi các lệnh được thực hiện trong hệ thống theo thứ tự thời gian Một lịch biểu đối với một tập các giao dịch phải bao gồm tất cả các lệnh của tất cả các giao dịch này, và phải bảo toàn thứ tự
mà các lệnh xuất hiện trong mỗi giao dịch cá thể theo thứ tự đó Lịch biểu tạo mối liên hệ ràng buộc giữa các giao dịch với nhau
Giao dịch T 2 chuyển 10% số dư từ tài khoản A đến tài khoản B và được định
nghĩa như sau:
T 2: Read(A);
Temp:= A * 0.1;
Trang 9Một giao dịch là một đơn vị thực hiện chương trình ứng dụng mà nó truy nhập
và có thể cập nhật các khoản mục dữ liệu khác nhau Việc nắm bắt được khái niệm giao dịch là mấu chốt đối với việc hiểu và cài đặt các cập nhật trong hệ quản trị cơ sở dữ liệu, sao cho các thực hiện đồng thời và các dạng lỗi khác nhau không dẫn cơ sở dữ liệu đến trạng thái không toàn vẹn và dữ liệu trong
cơ sở dữ liệu không nhất quán 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, tính nhất quán có thể không còn được bảo toàn nữa Do vậy, hệ thống cần điều khiển sự tương tác giữa các giao dịch đồng thời Do một giao dịch là một đơn vị xử lý nguyên tố đảm bảo tính nhất quán dữ liệu, một sự thực hiện tuần tự của các giao dịch sẽ đảm bảo tính nhất quán được bảo toàn Do vậy, chúng ta đòi hỏi một lịch biểu 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 lịch biểu thực hiện được sinh ra với các giao dịch 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 nói là đảm bảo tính khả tuần tự Vậy ta hãy xét đến khái niệm về lịch biểu tuần tự, khả tuần tự và bất tuần tự
i Lịch biểu tuần tự:
Một lịch biểu H được gọi là tuần tự nếu mọi giao dịch T trong H đều
có tất cả các lệnh của T và được thực hiện liên tiếp nhau
Ta nhận thấy rằng: các lệnh trong T 1 thực hiện trước, sau đó đến các
lệnh trong T 2
ii Lịch biểu bất tuần tự:
Một lịch biểu H được gọi là bất tuần tự nếu với mọi giao dịch T trong
H, tất cả các lệnh của T trong H được thực hiện không liên tiếp nhau
Ví dụ:
Trang 10Ta nhận thấy rằng: các lệnh thứ 1 và 2 trong T 1 được thực hiện trước,
sau đó thực hiện tiếp 2 lệnh thứ 1 và thứ 2 trong T 2 Vì lệnh thứ 2 trong
T 2 thực hiện sau, nên giá trị trong X bây giờ đã được thay đổi, dẫn đến khi lệnh thứ 3 trong T 1 được thực hiện thì giá trị X không còn đúng như lệnh 2 trong T 1 thực hiện, dẫn đến T 1 hoạt động không hiệu quả
iii Lịch biểu khả tuần tự:
Ta nhận thấy rằng: sau khi thực hiện xen kẽ các lệnh của T 1 và T 2, kết quả đều thỏa mãn yêu cầu
Ví dụ về lịch biểu tuần tự và khả tuần tự:
Giả sử ta có các giao dịch sau:
T1 T2 T3 R(X)
W(X) COMMIT
W(X) W(Y) R(Z) COMMIT
R(X) R(Y) R(Z) COMMIT
Trang 11Khi đó:
• Lịch biểu sau là tuần tự:
S= {W2(X), W2(Y), R2(Z), C2, R1(X), W1( X), C1, R3(X), R3( Y), R3( Z), C3}
• Lịch biểu sau là khả tuần tự:
S= {W2(X), R1(X), W1(X), C1, R3(X), W2( Y), R3(Y), R2(Z), C2, R3(Z), C3}
c Thuật toán kiểm tra lịch biểu tuần tự:
Chứng minh:
Bằng các ví dụ, việc chứng minh định lý này sẽ được dễ dàng hơn
Ví dụ:
Trên mục dữ liệu x có các thao tác (ký hiệu là OP) đụng độ
T1 OP1 trên x với tại thời điểm t1
T2 OP2 trên x với tại thời điểm t2
t1 < t1
►Vì vậy: t1 sẽ giữa khoá trên x tại t1, tương tự với t2
Ta đã biết, hai khoá (mà có ít nhất một khoá là khoá X) không thể đồng thời tồn tại tại cùng một thời điểm
►Vì vậy T2 chỉ có thể khoá x sau khi T1 đã giải phóng khoá, bởi vậy, với t’ và t’’ bất kỳ thoả t1 < t’ < t’’ ≤ t2:
● T1 giải phóng khoá trên x tại t’
● T2 khoá x tại t’’
►Theo định nghĩa của L1 và L2 ta có:
● L1 < t’ < t’’ ≤ L2 và vì vậy ta có
Trang 12● L1 < L2 ⇐ điều phải chứng minh!
►Giả sử có một lịch biểu tuân theo 2PL có chứa chu trình sau:
T1 -> T2, T2 -> T3, T3 ->T1thì theo hệ quả trên:
● L1 < L2
● L2 < L3
● L3 < L1 Như vậy có sự mâu thuẫn: L1 < L1
Vì vậy sẽ không có chu trình và lịch biểu là tuần tự
ii Nội dung thuật toán:
(1) Với mỗi giao tác Ti trong lịch biểu H:
Tạo một đỉnh có tên là Ti trong đồ thị có hướng;
(2) Với mỗi trường hợp giao tác Tj trong H thực hiện một lệnh
read(x) để đọc giá trị x mà nó đã được ghi bởi lệnh write(x) của giao tác Ti thì:
Tạo một cung từ Ti -> Tj trong đồ thị SG;
(3) Với mỗi trường hợp giao tác Tj trong H thực hiện một lệnh
write(x) để ghi trị x mà nó đã được đọc bởi lệnh read(x) của giao tác
Ti thì:
Tạo một cung từ Ti -> Tj trong đồ thị SG;
(4) Với mỗi trường hợp giao tác Tj trong H thực hiện một lệnh
write(x) để ghi trị x mà nó đã được đưọc ghi bởi lệnh write(x) của giao tác Ti trước đó thì:
Tạo một cung từ Ti -> Tj trong đồ thị SG;
(5) Lịch biểu H là khả tuần tự nếu và chỉ nếu đồ thị SG không có
chu trình;
Ví dụ:
S1:W2(x)W1(x)R3(x)R1(x)R1(x)W2(y)R3(y)R3(z)R2(x)
Trang 13S1 bất khả tuần tự vì đồ thị có chu trình
S4: R2(z)W2(x)W2(y)W1(x)R1(x)R3(x)R3(z)R3(y) S4 là lịch biểu khả tuần tự vì đồ thị không có chu trình
d Khả năng tự phục hồi:
Chúng ta đã xét đến các lịch biểu có thể chấp nhận được trên quan điểm nhất quán của cơ sở dữ liệu với ngầm định rằng không có các lỗi giao dịch xảy ra Bây giờ chúng ta sẽ chỉ ra tác động của các lỗi giao dịch khi thực hiện đồng thời
Nếu một giao dịch Ti bị lỗi vì một lý do nào đó, ta cần phải tháo bỏ tác động
của giao dịch này để đảm bảo tính nguyên tố của giao dịch Trong một hệ
thống cho phép thực hiện đồng thời, nếu Ti bị hủy bỏ thì phải đảm bảo rằng giao dịch Tj nào đó phụ thuộc vào Ti cũng phải được hủy bỏ Để đạt được sự
đảm bảo này, chúng ta cần đặt ra các hạn chế trên kiểu của các lịch được cho phép trong hệ thống này
Các lịch có khả năng tự phục hồi:
Xét một lịch biểu sau:
T8 T9 Read(A);
Trang 14chuyển giao Do T 9 đã đọc giá trị của khoản mục dữ liệu A được ghi bởi T 8,
chúng ta phải hủy bỏ T 9 để đảm bảo tính nguyên tố của giao dịch Tuy nhiên
T 9 đã được chuyển giao và không thể hủy bỏ Do vậy, chúng ta có một tình
huống ở đó lịch không thể phục hồi một các đúng đắn sau lỗi của T 8 Lịch biểu mà ta vừa thấy ở trên với việc chuyển giao tức thời sau lệnh
Read(A) là một ví dụ của một lịch không thể phục hồi mà sẽ không được
phép Hầu hết các hệ cơ sở dữ liệu yêu cầu rằng tất cả các lịch phải có khả năng phục hồi
Một lịch có khả năng phục hồi là một lịch ở đó với mỗi cặp giao dịch Ti và
Tj, trong đó: Tj đọc một khoản mục dữ liệu được ghi trước đó bởi Ti thì thao tác chuyển giao của Ti phải xuất hiện trước thao tác chuyển giao của
Tj
e Các lịch không lan truyền:
Khi có một lịch có khả năng phục hồi, để phục hồi một cách đúng đắn từ lỗi
của một giao dịch Ti, chúng ta phải quay lui một số giao dịch Các tình huống như vậy xảy ra nếu các giao dịch đã đọc dữ liệu được ghi bởi Ti
Ta hãy xét một lịch được thể hiện như sau:
Giao dịch T 11 đọc một giá trị của A được ghi bởi giao dịch T 10 Giao dịch
T 12 đọc một giá trị của A được ghi bởi giao dịch T 11 Giả sử rằng tại thời
điểm này giao dịch T 10 bị lỗi, do vậy T 10 phải quay lui Do T 11 phụ thuộc vào
T 10 nên T 11 cũng phải quay lui Do T 12 phụ thuộc vào T 11 nên T 12 cũng phải quay lui Hiện tượng này, trong đó một giao dịch bị lỗi dẫn đến một dãy các giao dịch phải quay lui, được gọi là quay lui lan truyền
Quay lui lan truyền là không mong muốn, do nó dẫn đến việc tháo bỏ một số đáng kể công việc Có thể mong muốn hạn chế các lịch mà đối với chúng các lan truyền quan lui không thể xảy ra Các lịch như thế được gọi là các lịch không lan truyền
Một lịch không lan truyền là một lịch trong đó với mỗi cặp các giao dịch Ti
và Tj – mà Tj đọc một khoản mục dữ liệu được ghi trước đó bởi Ti, thì thao tác chuyển giao của Ti phải xuất hiện trước thao tác đọc của Tj Từ đây ta dễ dàng thấy rằng: một lịch không lan truyền cũng là một lịch có khả năng phục hồi
Trang 15f Cài đặt tính độc lập:
Từ những trình bày ở trên, ta đã thấy những tính chất một lịch biểu phải có
để đảm bảo tính nhất quán của cơ sở dữ liệu và cho phép các lỗi giao dịch được điều khiển trong một phương pháp an toàn Đặc biệt, các lịch biểu tuần
tự, khả tuần tự và không lan truyền thỏa mãn các yêu cầu này
Các sơ đồ điều khiển đồng hành khác nhau có thể được sử dụng để đảm bảo rằng: thậm chí khi nhiều giao dịch được thực hiện đồng thời, chỉ các lịch chấp nhận được sinh ra, không kể đến việc chia sẻ tài nguyên giữa các giao dịch như thế nào
Một ví dụ thô sơ về điều khiển đồng hành: một giao dịch yêu cầu một khóa trên toàn bộ cơ sở dữ liệu trước khi nó thực hiện và giải phóng khóa sau khi
nó đã chuyển giao Trong khi một giao dịch giữ một khóa, không một giao dịch nào được phép yêu cầu khóa, do vậy tất cả các giao dịch khác thực hiện đồng thời với giao dịch này phải đợi cho đến khi nào khóa được giải phóng
Do chính sách khóa như vậy, nên chỉ có một giao dịch được thực hiện tại một thời điểm Vì vậy, chỉ có các lịch tuần tự được sinh ra Chúng là các lịch tuần tự tầm thường và dễ dàng thấy rằng chúng là các lịch biểu không lan truyền
Một sơ đồ điều khiển đồng hành như sơ đồ trên dẫn đến hiệu năng kém do nó buộc các giao dịch phải đợi các giao dịch trước đó hoàn thành trước khi nó được khởi động Nói cách khác, nó cung cấp một mức thấp của khả năng xử
lý đồng thời
Mục đích của các sơ đồ điều khiển đồng hành là cung cấp một mức hiệu năng cao của khả năng xử lý đồng thời, trong khi vẫn đảm bảo rằng tất cả các lịch biểu có thể được sinh ra là tuần tự, khả tuần tự và không lan truyền Trong phần tiếp theo dưới đây chúng ta sẽ xét đến các giao thức điều khiển đồng hành
4 Khoá chốt:
a Các khái niệm
- 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á chốt kết hợp với chúng
- Bộ xếp lịch đảm bảo rằng chỉ duy nhất giao tác có thể giữ khoá chốt trong một thời điểm, và chỉ có một giao tác 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 tác có thể truy cập dữ liệu dùng chung, bộ xếp lịch 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 tác 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 tác 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 tác T2, thì giao tác này phải chờ cho đến khi nào T2 giải phóng khoá đó
Trang 16- Có 2 loại khoá chốt: khoá đọc (read lock, rl) và khoá ghi (write lock, wl)
+ rli(x): khoá đọc trên phần tử dữ liệu x của giao tác Ti + wlj(x): khoá ghi trên phần tử dữ liệu x của giao tác Tj
- Hai khoá pli(x) và qlj(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 tác khác nhau và một trong hai thao tác là ghi
b Những quy tắc quản lý và sử dùng khoá
Qui tắc 1:
- Khi nhận được một thao tác pi[x] từ bộ quản lý giao tác (Transaction Manager, TM), bộ xếp lịch kiểm tra nếu pli[x] đụng độ với một vài qlj[x] được đặt trước đó
+ Nếu đúng, nó sẽ trì hoãn pi[x] và buộc Ti chờ cho đến khi nó có thể đặt được khoá cần thiết
+ Nếu không đụng độ, bộ xếp lịch (scheduler) sẽ đặt pli[x] và gởi pi[x] đến bộ quản lý dữ liệu (Data Manager, DM)
- Quy tắc này nhằm hạn chế hai giao tác truy xuất đồng thời một phần tử dữ liệu trong tình trạng đụng độ
Qui tắc 2:
- Mỗi khi bộ xếp lịch đặt khoá cho Ti, pli[x], nó không thể giải phóng khoá
đó cho đến khi DM trả lời đã xử lý thao tác tương ứng của khoá, pi[x]
c Khoá chốt hai pha(Two phase locking, 2PL):
- 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 tác
- Nhiệm vụ của bộ xếp lịch 2 giai đoạn (Two phase locking, 2PL) là quản lý khoá chốt và điều khiển giao tác khi nào lấy và khi nào giải phóng khoá
- 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 tác phải khóa mục x ( khóa
do ghi)
- Quá trình cấp phát và thu hồi khóa được thể hiện ở biểu đồ khoá 2PL sau:
Trang 17Giai đoạn tăng trưởng Giai đoạn thu hồi
Hình 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
Gọi Oper(T,x) là lệnh truy xuất mục dữ liệu x trong giao tác T
- Dựa vào kỹ thuật khóa chốt hai giai đoạn, có thể chia giao tác thành hai giai đoạn, dựa trên 3 nguyên tắc trên:
+ Giai đoạn tăng trưởng (growing phase), trong giai đoạn này nó nhận các khoá và truy xuất các mục dữ liệu
Khi bộ lập lịch nhận được lệnh Oper(T,x), nó kiểm tra lệnh này có tranh chấp với những lệnh truy xuất trên x khác, đã được bộ lập lịch cấp khóa
Nếu nó tranh chấp, lệnh Oper(T,x) bị bị trì hoãn
Nếu không tranh chấp, bộ lập lịch sẽ cấp 1 khóa cho x
và gửi lệnh này đến bộ quản lý dữ liệu
Bộ lập lịch sẽ không giải phóng khóa cho đến khi bộ quản lý dữ liệu đã thực hiện xong lệnh Oper(T,x)
+ Giai đoạn thu hồi (shrinking phase) là giai đoạn giải phóng những khoá của nó
Khi bộ lập lịch bắt đầu giải phóng bất kỳ khóa nào của giao tác T thì nó sẽ không cấp bất kỳ khóa nào cho T, cho dù các mục dữ diệu của T đòi hỏi khóa
Nếu T cứ đòi hỏi khóa khi tiến trình giải phóng khóa xảy ra thì chương trình phát sinh lỗi và giao tác sẽ gọi lệnh Abort
- Đ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 tác
- [Eswaran et al., 1976] đã có định lý khẳng định rằng mọi lịch biểu tạo bởi một thuật toán điều khiển đồng thời tuân theo quy tắc 2PL đều khả tuần
tự
d Khoá chốt hai pha chặt chẽ (Strict two phase locking)
- Một kỹ thuật khác được gọi là khóa chốt hai pha chặt chẽ Kỹ thuật này cũng gồm 2 giai đoạn:
Trang 18+ Giai đoạn tăng trưởng: giống với giai đoạn đầu của kỹ thuật khóa 2 pha
+ Giai đoạn thu hồi khóa:
Tất cả các khóa được giải phóng cùng một lúc sau khi giao tác
e Vấn đề bế tắc (deadlock)
- Vấn đề bế tắc luôn xảy ra trong các kỹ thuật dùng cơ chế khóa chốt
- Giả sử có 2 giao tác T1 và T2 thực hiện các lệnh đọc ghi trên mục dữ liệu x và
y như sau:
T1: lock (x); lock(y); read (x); write (y);
T2: lock (y); lock(x); read (y); write (x);
T1 chiếm giữ khóa x và cố gắng khóa y, T2 chiếm giữ khóa y và cố gắng
khóa x Hiện tượng bế tắc sẽ xảy ra
Trang 195 Thời nhãn:
a Khái niệm thời nhãn:
¾ Mỗi giao dịch được gán một danh biểu (mốc thời gian) duy nhất vào lúc bắt đầu
¾ Cơ chế quản lý đồng hành theo thời nhãn 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
Gọi fmax là thời nhãn của giao tác cuối cùng đọc bộ R
Gọi umax là thời nhãn của giao tác cuối cùng cập nhật bộ R
Gọi T là thời nhãn của giao tác T
Với mỗi giao dịch Ti trong hệ thống, chúng ta kết hợp với nó một nhãn thời gian cố định duy nhất được ký hiệu TS(Ti) Nhãn thời gian này được gán bởi
hệ cơ sở dữ liệu trước khi giao dịch Ti được khởi động thực hiện Nếu một giao dịch Ti đã được gán nhãn TS(Ti), một giao dịch mới Tj đi vào hệ thống thì TS(Ti)<TS(Tj) Có 2 phương pháp cài đặt sơ đồ này:
1 Sử dụng giá trị của đồng hồ hệ thống làm nhãn thời gian, có nghĩa là: nhãn thời gian của mọt giao dịch là giá trị của đồng hồ khi giao dịch đi vào hệ thống
2 Sử dụng một bộ đến logic mà nó được tăng lên sau ki một nhãn thời gian mới được gán, có nghĩa là: nhãn thời gian của một giao dịch là giá trị của bộ đếm khi giao dịch đi vào hệ thống
Các nhãn thời gian của giao dịch xác định thứ tự khả tuần tự Do vậy, nếu TS(Ti)<TS(Tj), thì hệ thống phải đảm bảo rằng lịch được sinh ra là tương đương với một lịch tuần tự theo thứ tự Ti rồi đến Tj
Các quy tắc của thuật toán này:
1 Hai thao tác O 1 và O 2 thuộc hai giao dịch T 1 và T 2 (O 1 và O 2 xung
đột với nhau) khi đó O 1 sẽ được thực hiện trước O 2 nếu và chỉ nếu
T 1 <T 2 T 1 được hiểu là giao dịch “cũ hơn”, còn T2 được hiểu là giao
dịch “mới hơn”
2 Bộ lập lịch (SC) trong khi thực hiện một thao tác mới, kiểm tra tất cả
các thao tác xung đột Nếu thao tác đó thuộc một giao dịch “cũ nhất”
Trang 20thì nó sẽ được thực hiện, ngược lại: toàn bộ các thao tác của giao dịch
đó sẽ được khởi động lại và nhận một nhãn thời gian TS mới
Để cài đặt sơ đồ này, chúng ta kết hợp với mỗi khoản mục dữ liệu Q hai giá trị nhãn thời gian:
1 W-timestamp(Q) hay WTS(Q) ký hiệu nhãn thời gian lớn nhất của giao dịch đã thực hiện thành công lệnh write(Q)
b Giao thức kết thúc hai giai đoạn (two phase commit protocol):
Giao thức kết thúc 2 giai đoạn (2 phase commit protocol – 2PC):
Giai đoạn 1:
Xét một giao tác T được khởi động từ một vị trí nào đó và gọi thực hiện các giao tác ở các site khác hoặc ở chính vị trí khởi động giao tác T ( ta gọi các giao tác này là C)
Tất cả các giao tác con Ti sẽ quyết định đồng ý hay không Giao tác con C gởi tín hiệu báo chuẩn bị kết thúc cho các Ti và Ti sẽ trả lời cho
C bằng tín hiệu đồng ý kết thúc hay không
Trang 21Kết thúc 2 giai đoạn (2PC) – không đồng ý:
6 Xử lý giao tác (Transaction Processing)
a Mỗi giao tác liên kết tất cả các tác vụ đọc/ghi của nó với bộ quản lý giao tác (TM)
b TM liên kết từng giao tác đọc ghi với SC
c Bộ SC điều khiển chuỗi giao tác, theo đó DM xử lý các lệnh dọc/ghi và duy trì điều khiển đồng hành
Khi SC nhận một thao tác từ TM, nó có ba cách chọn lựa:
• Ngay lập tức lập lịch cho thao tác đó (bằng cách gửi nó đến bộ DM);
• Trì hoãn thao tác (bằng cách chèn nó vào trong một hàng đợi nào đấy); hoặc
• Từ chối thao tác
Bộ DM sẽ thực hiện từng lệnh đọc/ghi nhận được Đối với tác vụ đọc, bộ DM duyệt CSDL cục bộ và trả về giá trị yêu cầu Đối với tác vụ ghi, bộ DM sửa đổi CSDL cục bộ và và trả về một ghi nhận chấp thuận thao tác cho bộ SC Đến lượt, bộ SC trả
về cho TM và TM trả về cho giao tác
Kiến trúc của một bộ giám sát thực hiện các giao dịch được thể hiện như trong hình vẽ sau:
Trang 22Transaction Manager
(TM)
Scheduler (SC)
Scheduling/
Descheduling Requests
Begin_Transaction Read, Write
Distributed Execution Monitor
With other CSs
Trong kiến trúc phân tán, các giao tác có thể truy cập dữ liệu từ nhiều vị trí khác
nhau Vì vậy tại mỗi vị trí sẽ có một bộ quản lý giao tác cục bộ (Local Transaction Manager) nhằm đáp ứng các việc:
♦ duy trì nhật ký (log) cho việc khôi phục dữ liệu
♦ tham gia trong việc phối hợp kiểm soát đồng hành các giao tác được thực hiện tại vị trí đó
Tại mỗi một vị trí như vậy cũng sẽ có một bộ phối hợp giao tác (Transaction Coordinator_TC) nhằm:
♦ khởi tạo giao tác phát sinh tại chỗ
♦ phân phối các giao tác con (subtransactions) đến các vị trí thích hợp để thực thi
♦ đối với giao tác (xuất phát tại chỗ) mà giao tác này đã được hoàn tất hoặc bị hủy
bỏ tại tất cả các vị trí, TC có nhiệm vụ kết thúc giao tác ấy
Trang 237 Các phương pháp kiểm soát đồng hành
Ví dụ: cho ba giao tác cùng với tập các lệnh thực hiện như sau:
T1: Read(x) T2: Write(x) T3: Read(x) Write(x) Write(y) Read(y) Commit Read(z) Read(z)
//Thủ tục tin tổng số dư hai tài khoản Procedure PrintSum begin
có kết quả khác nhau như khi mỗi giao tác thực thi tuần tự và vì thế chúng cũng bất khả tuần tự
Mặc dù hai thực thi xem kẽ này là bất khả tuần tự nhưng lại có nhiều thực thi khác khả tuần tự Ví dụ, cho hai giao tác Transfer và PrintSum được thực hiện xen kẽ như sau:
Read,(Accounts[7]) returns the value $200 Write,(Accounts[7], $100)
Read,(Accounts[7]) returns the value $100 Read,( Accounts[ 861) returns the value $200 Write,(Accounts[86], $300)
Commit, Read,(Accounts[86]) returns the value 5300
Trang 24Vì thế thực thi xen kẽ như trên gọi là khả tuần tự
Tính khả tuần tự là định nghĩa của tính chính xác cho điều khiển đồng hành trong các DBS