Tại sao điều khiển đồng thời là cần thiết

Một phần của tài liệu Xử lý truy vấn và quản lý giao tác trong cơ sở dữ liệu (Trang 57 - 60)

Một số vấn đề có thể xảy ra khi các giao tác đồng thời thực thi theo cách thức không đƣợc điều khiển. Ví dụ xét cơ sở dữ liệu đặt vé máy bay của hãng hàng không đã đƣợc đơn giản hóa, mỗi bản ghi trong cơ sở dữ liệu đƣợc lƣu trữ cho từng chuyến bay. Hình 2.2(a) thể hiện giao tác T1, giao tác này chuyển N chỗ từ một chuyến bay X sang chuyến bay Y (tƣơng ứng có X, Y

(a) T1 read_item (X); X:= X – N; write_item(X); read_item(Y); Y:= Y+N; write_item(Y); (b) T2 read_item (X); X:= X +M ; write_item(X);

57

chỗ ngồi). Hình 2.2(b) thể hiện giao tác T2 đơn giản hơn, giao tác này phục hồi M chỗ trên chuyến bay X. Để đơn giản hoá, không đƣa thêm các thành phần khác của giao tác nhƣ kiểm tra xem nếu nhƣ một chuyến bay có đủ chỗ sẵn sàng trƣớc khi đặt thêm các chỗ mới hay không.

Khi một chƣơng trình truy xuất cơ sở dữ liệu, nó có số các chuyến bay, ngày bay và số chỗ đã đƣợc đặt trƣớc nhƣ là các biến; do đó, cùng chƣơng trình đó có thể đƣợc sử dụng để thực thi nhiều giao tác với từng chuyến bay khác nhau và số chỗ đƣợc đặt khác nhau. Với mục đích điều khiển đồng thời, một giao tác là một lần thực thi riêng biệt của chƣơng trình trên một ngày bay, chuyến bay, số chỗ cụ thể. Trong hình 2.2(a) và (b), giao tác T1 và T2 là các lần thực thi riêng biệt của chƣơng trình cho các chuyến bay với số các chỗ đƣợc lƣu trong các mục dữ liệu X và Y trong cơ sở dữ liệu.

Vấn đề cập nhật không thành công: Vấn đề này xảy ra khi 2 giao tác truy cập vào cùng mục cơ sở dữ liệu, các giao tác này bao gồm các thao tác xen kẽ nhau làm cho giá trị của các mục dữ liệu không chính xác. Giả sử giao tác T1 và T2 đƣợc chấp nhận tại thời điểm xấp xỉ nhau, và các thao tác của chúng đƣợc xen kẽ nhƣ thể hiện trong hình 2.3(a); khi đó giá trị cuối cùng của mục X bị sai bởi vì T2 đọc giá trị của X trƣớc khi T1 thay đổi nó trong cơ sở dữ liệu và do đó kết quả giá trị cập nhật từ T1 sẽ bị mất. Ví dụ, nếu ban đầu có X=80 chỗ ngồi trên một chuyến bay. Giao tác T1 chuyển N=5 chỗ sang chuyến bay khác, sau đó giao tác T2 khôi phục M=4 chỗ trên chuyến bay. Kết quả cuối cùng số chỗ trên chuyến bay sau khi thay đổi phải là X=79, nhƣng vì có sự xen kẽ đồng thời xẩy ra nên kết quả thu đƣợc X=84 và đây là kết quả sai. a) read_item(X); X := X –N write_item(X); read_item(Y); T1 T2 Thời gian read_item(X); X:= X + M;

b) c) T1 T2 read_item(X); X:=X+N; write_item(X) ; read_item(Y); read_item(X); X:=X+M; write_item(X) ;

Hình 2.3. Một số vấn đề xảy ra khi thực thi đồng thời không được điều khiển. (a) Vấn đề cập nhật không thành công. (b) Vấn đề cập nhật tạm thời

T1 T3 sum:=0; read_item(A); sum:=sum +A; read_item(X); X:=X-N; write_item(X) read_item(X); sum:=sum+X; read_item(Y); sum:=sum+Y; read_item(Y); Y:=Y+N;

Vấn đề cập nhật tạm thời. Vấn đề này xảy ra khi một giao tác cập nhật một mục cơ sở dữ liệu và sau đó giao tác bị lỗi nhƣng các mục dữ liệu này lại đƣợc truy cập bởi giao tác khác trƣớc khi nó phải đƣợc trả lại giá trị ban đầu. Hình 2.3(b) thể hiện một ví dụ với T1 cập nhật giá trị X và sau đó bị lỗi trƣớc khi hoàn thành, do đó hệ thống phải thay đổi X trả lại giá trị ban đầu của nó. Trƣớc khi điều này đƣợc thực hiện thì T2 lại đọc giá trị tạm thời đó của X.

Vấn đề tóm tắt sai: Nếu một giao tác đang tính toán một hàm tổng hợp trên một số bản ghi trong khi các giao tác khác lại đang cập nhật bản ghi đó, dẫn đến kết quả của hàm tính toán có thể bị sai. Ví dụ, giả sử một giao tác T3 đang tính tổng số vé đƣợc đặt trƣớc trên tất cả các chuyển bay, trong khi giao tác T1 đang thực thi. Nếu sự đan xen của các thao tác thể hiện trong hình 2.3(c) xảy ra, kết quả của T3 sẽ bị thiếu hụt số chỗ N=5 bởi vì T3 đọc giá trị X sau khi N vé bị trừ đi. Nhƣng đọc giá trị Y trƣớc N vé đƣợc cộng thêm vào.

Vấn đề khác có thể xảy ra đƣợc gọi là đọc không lặp lại, có nghĩa là một giao tác T đọc một mục dữ liệu 2 lần và mục dữ liệu đó đƣợc thay đổi bởi giao tác khác T‟ giữa 2 lần đọc đó. Do đó, T nhận đƣợc hai giá trị khác nhau với hai lần đọc của cùng một mục dữ liệu. Điều này có thể xảy ra, nếu một khách hàng đang hỏi về số ghế còn trên một số chuyến bay, sau đó mới quyết định đặt vé dẫn đến có giao tác đọc số ghế hai lần trên một chuyến bay.

Một phần của tài liệu Xử lý truy vấn và quản lý giao tác trong cơ sở dữ liệu (Trang 57 - 60)