Khi các giao tác đƣợc thực thi đồng thời theo cách thức xen kẽ, sau đó thứ tự của việc thực thi các thao tác từ các giao tác khác nhau đƣợc biết nhƣ là một lịch biểu.
2.4.1 Lịch biểu của các giao tác
Một lịch biểu S của n giao tác T1, T2,...Tn là thứ tự các hoạt động của giao tác đƣa ra để ràng buộc, các thao tác của giao tác Ti trong S phải xuất hiện theo đúng thứ tự trong Ti. Tuy nhiên các thao tác từ các giao tác Tj khác có thể xen kẽ với các thao tác của Ti trong S. Vì thế cần cân nhắc trật tự của các thao tác trong S. [1, 4]
Với mục đích khôi phục và điều khiển đồng thời, do đó cần quan tâm chủ yếu vào các thao tác read-item và write_item, cũng nhƣ xác nhận và hủy bỏ các giao tác. Sử dụng ký hiệu r, w, c và a đối với các thao tác read_item, write_item, commit, abort, và bổ xung các chỉ số định danh giao tác (số giao tác) vào từng thao tác trong lịch biểu. Trong các ký hiệu này, mục cơ sở dữ liệu X đƣợc đọc hoặc viết theo các thao tác r và w trong dấu ngoặc đơn “( )”. Ví dụ, lịch biểu của hình 2.3(a) ở trang 56 gọi là Sa và có thể đƣợc viết nhƣ sau:
Sa: r1(X); r2(X); w1(X); r1(Y); w2(X); w1(Y);
Hình 2.3(b) ở trang 57 cho tƣơng ứng lịch biểu Sb nếu giao tác T1 đƣợc huỷ bỏ sau khi thực hiện thao tác read_item(Y):
Sb: r1(X); w1(X); r2(X); w2(X); r1(Y); a1;
Hai thao tác trong một lịch biểu đƣợc gọi là xung đột nếu chúng thỏa mãn cả 3 điều kiện sau:
(1) Chúng thuộc các giao tác khác nhau
(2) Chúng truy cập vào cùng mục dữ liệu (ví dụ là X) (3) Ít nhất một trong các thao tác là write_item(X).
Xét lịch biểu Sa, các thao tác r1(X) và w2(X) xung đột, tƣơng tự các thao tác r2(X) với w1(X) và w1(X) với w2(X) là xung đột. Tuy nhiên, các thao tác r1(X) và r2(X) không xung đột bởi vì chúng đều là các thao tác đọc; các thao tác w2(X) và w1(Y) không xung đột bởi vì chúng thao tác trên các mục
dữ liệu phân biệt X và Y; và các thao tác r1(X) và w1(X) không xung đột bởi vì chúng thuộc cùng một giao tác.
Một lịch biểu S của n giao tác T1, T2,...,Tn đƣợc gọi là một lịch biểu hoàn thành nếu các điều kiện sau đây đƣợc đảm bảo [4, 6]:
1. Các thao tác trong S chính xác là các thao tác trong T1, T2, ...,Tn, thêm một thao tác chấp nhận hay hủy bỏ nhƣ là thao tác cuối đối với mỗi giao tác trong lịch biểu
2. Đối với bất kỳ cặp thao tác từ cùng giao tác Ti thứ tự xuất hiện của chúng trong S giống nhƣ thứ tự của chúng trong Ti.
3. Đối với bất kỳ 2 thao tác xung đột nào, một trong 2 thao tác đó phải xảy ra trƣớc thao tác còn lại trong lịch biểu.
Nói chung, khó có đƣợc lịch biểu đầy đủ trong một hệ thống xử lý giao tác, bởi vì các giao tác mới đang tiếp tục đƣợc chấp nhận vào hệ thống.
2.4.2 Miêu tả đặc tính các lịch biểu dựa trên việc khôi phục [1, 6]
Đối với một vài lịch biểu thì việc phục hồi sau những lỗi của giao tác là dễ, tuy nhiên đối với những lịch biểu khác việc xử lý phục hồi gặp nhiều rắc rối. Do vậy, việc phân loại lịch biểu để phục hồi là rất quan trọng.
Giao tác T đƣợc cam kết thì nó không cần khôi phục. Trong lịch biểu S có hai giao tác là T‟ và T thì lịch biểu S có thể phục hồi nếu giao tác T chƣa cam kết cho đến khi tất cả các thao tác của giao tác T‟ đƣợc cam kết, và thao tác “Read” của T đọc dữ liệu từ T‟ đƣợc cam kết. Hơn nữa, T‟ không bị huỷ bỏ trƣớc khi T đọc khoản mục X và không có một giao tác nào ghi X xen giữa T và T‟ (trừ khi những giao tác đã huỷ bỏ T trƣớc khi đọc X).
Lịch biểu có thể phải phục hồi do quá trình xử lý xen kẽ, nhƣng nếu thông tin đƣợc lƣu đủ trong file log thì thuật toán phục hồi có thể đƣợc đƣa ra. Lịch biểu Sa và Sb ở trên đều có thể phục hồi vì chúng thoả mãn điều kiện trên. Lịch biểu Sa‟ đƣợc đƣa ra dƣới đây giống nhƣ lịch biểu Sa ngoại trừ hai thao tác cam kết đƣợc thêm vào Sa:
Sa‟ có thể phục hồi, thậm chí nó trở nên tồi tệ hơn vì nhiều vấn đề cập nhật không thành công. Tuy nhiên cân nhắc với hai lịch biểu bộ phận Sc và Sd sau:
Sc: r1(X); w1(X), r2(X), r1(Y), w2(X), c2, a1
Sd: r1(X); w1(X); r2(X); r1(Y); w2(X); w1(Y); c1 ; c2. Se: r1(X); r2(X); w1(X); r1(Y); w2(X); w1(Y); a1 ; a2
Sc không thể phục hồi vì T2 đọc X từ T1 và sau đó T2 cam kết trƣớc khi T1 cam kết. Nếu T1 huỷ bỏ sau thao tác c2 trong Sc thì giá trị X mà T2 đọc không còn hợp lệ và T2 phải bị huỷ bỏ sau khi nó đã cam kết, dẫn đến lịch biểu không thể phục hồi. Đối với lịch biểu có thể phục hồi thì thao tác c2 trong Sc phải bị huỷ bỏ đến sau khi T1 cam kết. Nhƣ đã trình bầy ở Sd, nếu T1 huỷ bỏ mặc dù đã cam kết thì sau đó T2 cũng huỷ bỏ nhƣ Se vì giá trị của X mà thao tác “Read” thực hiện cũng không hợp lệ. Trong lịch biểu có thể phục hồi, không có giao tác cam kết phải khôi phục. Tuy nhiên, một số trƣờng hợp có thể xẩy ra vì ở đó giao tác đƣợc cam kết phải đƣợc khôi phục bởi nó đọc khoản mục từ giao tác bị lỗi. Điều này đƣợc minh hoạ ở Se, ở đó giao tác T2 phải đƣợc phục hồi vì nó đọc X từ T1 và sau đó T1 bị huỷ bỏ.
Khôi phục tốn nhiều thời gian do số lƣợng giao tác cần phục hồi. Nếu mỗi giao tác trong lịch biểu chỉ đọc các khoản mục đƣợc ghi bởi giao tác đƣợc cam kết, thì tất cả các khoản mục đƣợc đọc sẽ không bị loại bỏ và không cần phải khôi phục. Để thảo mãn yếu tố này, thao tác r2(x) trong Se bị hoãn đến khi T1 đã cam kết (hoặc bị huỷ bỏ), tuy phải trì hoãn T2 nhƣng sẽ không phải khôi phục nếu T1 hỏng.
Những hạn chế đƣợc đặt ra cho lịch biểu là những giao tác không đƣợc đọc và ghi khoản mục X đến khi thao tác write(X) của giao tác cuối cùng đã cam kết (hoặc huỷ bỏ). Lịch biểu nghiêm ngặt đơn giản hoá xử lý phục hồi. Trong lịch biểu này, quá trình huỷ bỏ thao tác write(X) của giao tác là trả lại giá trị cũ cho cơ sở dữ liệu. Quá trình này luôn thực hiện đối với lịch biểu có thể phục hồi hoặc không xếp thứ tự.
Sf: w1(x,5), w2(x,8),a1
Giả định giá trị ban đầu của X=9 đƣợc lƣu trong hệ thống file log cùng với thao tác w1(x,5). Nếu T1 huỷ bỏ, quá trình phục hồi phải trả lại giá trị cãi=9 trƣớc khi thực hiện thao tác write bị huỷ bỏ, nhƣng nó đã bị đổi thành X=8 bởi giao tác T2, do vậy dẫn đến kết quả không chính xác. Mặc dù lịch biểu Sf là không xếp thứ tự, nó không là lịch biểu nghiêm ngặt vì nó từ chối T2 để ghi X thậm chí giao tác Ti cuối cùng ghi X đã không cam kết (hoặc huỷ bỏ). Lịch biểu xung đột không có vấn đề này.