Khi truy vấn, có thể xảy ra tình huống có hai câu truy vấn của hai người dùng khác nhau cùng cập nhật một mục dữ liệu, hoặc hệ thống bị sự cố và phải ngừng hoạt động trong khi đang thực hiện truy vấn. Những tình huống này gây tổn hại lớn đối với hệ thống nếu như không có biện pháp xử lý.
1.5.1 Giao dịch
Định nghĩa
Giao dịch là một đơn vị tính toán nhất quán và tin cậy. Một giao dịch nhận một CSDL, thực hiện một hành động trên CSDL và tạo tạo một bản CSDL mới.
Nó chuyển CSDL từ trạng thái cũ sang một trạng thái mới. Nói chung một giao dịch được xem như một dãy các thao tác đọc và ghi trên CSDL cùng với các bước tính toán cần thiết.
Một giao dịch được đặc tả trong ngôn ngữ SQL như sau Begin_transaction dinh_danh
begin
EXEC SQL cau_truy_van end.
Một giao dịch có thể hoàn thành công việc của mình gọi đã ủy thác (commit). Ngược lại, nếu bị dừng mà chưa hoàn thành công việc thì ta gọi là giao dịch bị hủy bỏ (abort). Khi một giao dịch bị hủy bỏ, quá trình thực thi sẽ ngừng và tất cả mọi hành động đã thực hiện đều phải được phục hồi lại để đưa CSDL về trạng thái đúng trước khi thực hiện giao dịch. Khi giao dịch đã được ủy thác thì nó báo cho DBMS biết CSDL đã chuyển sang một trạng thái mới, và kết quả này được lưu vào trong CSDL và không thể phục hồi lại được.
Tính chất của giao dịch
Các giao dịch được đặc trưng bằng các thao tác đọc và ghi. Chúng có các tính chất sau:
Tính nhất thể: Có nghĩa là hành động của một giao dịch, hoặc là hoàn thành tất cả, hoặc là không một hành động nào hoàn tất.
Tính đúng đắn: Một giao dịch là đúng đắn, tức là ánh xạ CSDL từ trạng thái đúng đắn này sang trạng thái đúng đắn khác. Có 4 yêu cầu đảm bảo tính đúng đắn cho một giao dịch T:
o T không ghi đè lên dữ liệu của những giao dịch khác đang sử dụng.
o T không cho phép bất kỳ thao tác ghi nào lên dữ liệu mà nó đang làm việc cho đến khi hoàn thành giao dịch
o T không đọc dữ liệu đang sử dụng của những giao dịch khác
o Những giao dịch khác không được sử dụng dữ liệu mà T đã đọc cho đến khi T hoàn tất.
Một giao dịch T gọi là đúng đắn độ 3 nếu nó thoả mãn cả 4 yêu cầu trên.
Một giao dịch T gọi là đúng đắn độ 2 nếu nó thoả mãn 3 yêu cầu. Một giao dịch T gọi là đúng đắn độ 1 nếu nó thoả mãn 2 yêu cầu. Một giao dịch T gọi là đúng đắn độ 0 nếu nó thoả mãn yêu cầu 1.
Tính biệt lập đòi hỏi mỗi giao dịch phải hoạt động với những trạng thái đóng của CSDL, tức là một giao dịch khi đang thực thi không thể uỷ thác các kết quả của nó cho những giao dịch khác đang cùng hoạt động, chừng nào giao dịch chưa kết thúc.
Tính bền vững đảm bảo rằng một giao dịch khi đã ủy thác thì kết quả của nó không bị thay đổi và bị xóa khỏi CSDL.
Các loại giao dịch
Phân loại theo thời gian hoạt động của giao dịch.
Có hai loại giao dịch:
Giao dịch trực tuyến: Có thời gian thực thi/ đáp ứng rất ngắn khoảng vài giây và truy xuất một phần CSDL rất nhỏ (ví dụ như giao dịch ngân hang, giao dịch đặt chỗ máy bay)
Giao dịch theo lô: Dùng nhiều thời gian hơn khoảng phút, giờ, ngày, truy xuất CSDL khá lớn.
Phân loại theo cách tổ chức đọc ghi.
Tổng quát: pha trộn các hành động đọc và ghi, không theo thứ tự
Giao dịch hai bước: buộc mọi hành động đọc phải được thực hiện trước mọi hành động ghi.
Giao dịch hạn chế: buộc phải đọc một mục dữ liệu trước khi cập nhật
Giao dich hai bước hạn chế: nếu nó thuộc loại hai bước và loại hạn chế.
Giao dịch theo mô hình hành động: yêu cầu từng cặp <đọc, ghi>
được thực hiện theo kiểu nguyên tử.
Phân loại theo cấu trúc của giao dịch
Giao dịch phẳng: có một điểm khởi đầu duy nhất begin_transaction, và một điểm kết thúc duy nhất end_transaction.
Giao dịch lồng: cho phép một giao dịch chứa các giao dịch khác.
Những giao dịch được đặt trong giao dịch khác gọi là giao dịch con.
Có hai kiểu là lồng đóng và lồng mở. Trong giao dịch lồng đóng, các giao dịch con phải bắt đầu sau cha và kết thúc trước cha. Giao dịch lồng mở cho phép bên ngoài thấy được một phần kết quả của nó.
Giao dịch lồng cho phép khôi phục một cách độc lập cho mỗi giao dịch con sau khi gặp sự cố.
Kiến trúc
Bộ phận theo dõi hoạt động phân tán gồm hai đơn vị là bộ quản lý giao dịch (Transaction Manager-TM) và bộ xếp lịch (Scheduler-SC). TM chịu trách nhiệm điều phối việc thực hiện các thao tác CSDL của các ứng dụng. Ngược lại SC chịu trách nhiệm cài đặt một thuật toán điều khiển đồng thời cụ thể nhằm đồng bộ hóa việc truy xuất CSDL. Ngòai ra, bộ quản lý khôi phục cục bộ tại mọi vị trí để cài đặt các thủ tục khôi phục tại chỗ nhằm đưa CSDL về trạng thái đúng sau khi xảy ra sự cố (xem hình 1.6).
Bộ quản lý giao dịch TM
Bộ xếp lịch SC
Xếp lịch các yêu cầu
Bộ phận theo dõi hoạt động phân tán Kết quả Các lệnh
TM khác
SC khác Với các bộ xử lý dữ liệu
Đến các bộ xử lý dữ liệu
Hình 1.6: Mô hình bộ phận theo dõi hoạt động phân tán Bộ TM cài đặt một giao diện cho các ứng dụng, gồm 5 lệnh:
begin_transaction, read, write, commit, abort.
Begin_transaction: là điểm chỉ ra cho TM là có một giao dịch mới bắt đầu. TM sẽ ghi nhận điều này
Read: nếu mục dữ liệu x được lưu cục bộ, giá trị của nó được đọc và chuyển cho giao dịch. Nếu không, TM sẽ chọn một bản sao của x và yêu cầu chuyển bản sao đó cho giao dịch
Write: TM điều phối việc cập nhật giá trị x tại mỗi vị trí có chứa nó
Commit: TM điều phối việc cập nhật vật lý của toàn thể CSDL có chứa bản sao của mỗi mục dữ liệu mà một lệnh write trước đó đã đưa ra
Abort: TM kiểm tra lại rằng không có tác động nào của giao dịch được phản ánh trong CSDL.
1.5.2 Điều khiển đồng thời phân tán
Mức độ đồng thời (số lượng giao dịch hoạt động cùng một lúc) là một tham số quan trọng nhất trong hệ phân tán. Do đó, cơ chế điều khiển đồng thời cố
gắng tìm ra một phương án thích hợp vừa duy trì được tính nhất quán của CSDL vừa duy trì được mức độ đồng thời cao.
Phân loại các cơ chế điều khiển đồng thời
Việc phân loại có thể dựa trên cơ chế phân tán CSDL. Đó có thể là cơ chế điều khiển trên CSDL nhân bản hòan toàn, CSDL phân hoạch, CSDL nhân bản một phần. Các thuật toán điều khiển cũng có thể được phân loại theo topology của mạng (xem hình 1.7) .
Các thuật toán điều khiển đồng thời
Bi quan Lạc quan
Khóa chốt
Tập trung Bản chính Phân tán
Dấu thời gian
Cơ bản Đa bản Bảo toàn
Lai Khóa chốt Dấu thời gian
Hình 1.7: Phân loại các thuật toán điều khiển đồng thời
Trong cách dùng khóa chốt, việc đồng bộ hóa giao dịch sử dụng các khóa chốt vật lý hoặc logic trên một phần của CSDL.
Khóa tập quyền: một trong các vị trí của mạng được chỉ định làm vị trí chính, ở đó lưu trữ các bảng khóa cho toàn bộ CSDL và chịu trách nhiệm trao khóa cho các giao dịch
Khóa bản chính thì ngược lại. Một trong các bản sao của mỗi đơn vị khóa được chỉ định làm bản chính, và nó là bản sẽ bị khóa khi giao dịch truy xuất đến đơn vị đó. Nếu CSDL không được nhân bản thì cơ chế khóa bản chính sẽ phân phối trách nhiệm quản lý khóa cho một số vị trí
Khóa phi tập trung: nhiệm vụ quản lý khóa là của tất cả các vị trí trong mạng. Mỗi bộ xếp lịch cục bộ chiụ trách nhiệm về các đơn vị
Trong lớp cơ chế theo timestamp ordering - TO, phải tổ chức thứ tự thực hiện các giao dịch nhằm duy trì được tính nhất quán tương hỗ giữa các vị trí.
Việc xếp thứ tự này được duy trì bằng cách gán TO cho cả giao dịch lẫn mục dữ liệu trong CSDL. Có 3 loại thuật toán là loại TO cơ bản, TO đa phiên bản, TO bảo toàn.
Thuật toán điều khiển đồng thời bằng khóa chốt
Ý tưởng chính là đảm bảo dữ liệu dùng chung cho các thao tác tương tranh chỉ được truy xuất mỗi lần một giao dịch. Điều này được thực hiện bằng cách liên kết một khóa (lock) với mỗi đơn vị khóa. Khóa này được giao dịch đặt ra trước khi nó truy xuất và được điều chỉnh lại vào lúc kết thúc sử dụng đơn vị khóa. Một đơn vị khóa không thể truy xuất nếu nó đã bị khóa bởi một giao dịch khác. Một yêu cầu khóa giao dịch chỉ được giao nếu đơn vị đó không bị một giao dịch khác nắm giữ.
Việc đồng bộ hóa các thao tác tương tranh của các giao dịch đòi hỏi phải dùng có hai loại khóa là khóa đọc (rl) và khóa ghi (wl). Một giao dịch Ti muốn đọc một mục dữ liệu được chứa trong đơn vị khóa x sẽ nhận được một khóa đọc trên x, ký hiệu là rli(x). Tương tự với trường hợp ghi. Hai khóa là tương thích với nhau nếu hai giao dịch truy xuất đến cùng một mục dữ liệu có thể nhận được khóa trên mục dữ liệu đó cùng lúc. Ta thấy rằng, chỉ có hai khoá đọc mới có thể tương thích được, do các hoạt động đọc không quan tâm đến thứ tự. Còn lại giữa các khóa đọc ghi, ghi đọc, ghi ghi thì đều không tương thích.
Các DBMS phân tán không chỉ quản lý các khóa mà còn có trách nhiệm xử lý khóa cho các giao dịch. Người sử dụng sẽ không phải xác định khi nào cần khóa dữ liệu, DBMS sẽ lo liệu điều này mỗi khi giao dịch đưa ra yêu cầu đọc hoặc ghi. Trong hệ thống dùng khóa chốt, bộ SC chính là bộ quản lý khóa. Bộ quản lý giao dịch sẽ chuyển cho bộ quản lý khóa các thao tác CSDL đọc ghi, và các thông tin kèm theo. Sau đó, bộ quản lý khóa sẽ kiểm tra xem đơn vị khóa có chứa mục dữ liệu đang bị khóa không. Nếu có, và khóa đó không tương thích với khóa yêu cầu, thì giao dịch sẽ bị hoãn lại. Ngược lại thì khóa sẽ được đặt và thao tác được thực hiện. Sau đó bộ quản lý giao dịch được báo về kết quả thực hiện. Việc kết thúc giao dịch sẽ giải phóng khóa khỏi đơn vị khóa.
Quy tắc khóa hai pha (2PL) được phát triển cho cho trường hợp một giao dịch cần nhiều khóa. Nó yêu cầu một giao dịch không được giải phóng khóa cho đến khi nó đảm bảo rằng không còn yêu cầu thêm khóa nữa. 2PL gồm có hai pha, một pha tăng trưởng nhận các khóa, truy xuất các mục dữ liệu, và một pha
thu hồi, là giai đoạn giải phóng khóa. Điểm khóa là điểm giao dịch đã nhận được hết khóa, nhưng chưa giải phóng khóa nào. Tuy nhiên, do việc hủy bỏ dây chuyền nên sẽ xảy ra trường hợp tại thời điểm giải phóng khóa, giao dịch chưa thực hiện xong yêu cầu với mục dữ liệu. Vì vậy, một thuật toán chặt chẽ hơn là khóa chốt hai pha nghiêm ngặt đặt ra, cho phép có một khoảng thời gian để thực thi giao dich, rồi sau đó mới giải phóng đồng thới các khóa, đảm bảo thời gian vẫn là không đổi so với 2PL thường.
Bắt đầu Điểm khóa Kết thúc Thời gian giao dich Số
khóa
Bắt đầu Điểm khóa Kết thúc Thời gian giao dich Số
khóa
Nhận khóa
Giải phóng khóa
Thời gian sử dụng dữ liệu
Hình 1.8: Biểu đồ khóa 2 PL và 2 PL nghiêm ngặt
Thuật toán điều khiển đồng thời bằng dấu thời gian
Thuật toán TO chọn trước một thứ tự tuần tự hóa và thực hiện các giao dịch theo thứ tự đó. Bộ quản lý giao dịch sẽ gán cho mỗi giao dịch Ti một dấu thời gian (timestamp) duy nhất ts(Ti) tại lúc bắt đầu. Dấu thời gian là một định danh đơn giản được dùng để nhận ra mỗi giao dịch một cách duy nhất và cho phép xếp thứ tự chúng. Hai dấu thời gian do bộ quản lý giao dịch tạo ra phải là đơn điệu tăng. Phương pháp để gắn dấu thời gian là sử dụng bộ đếm tăng đơn điệu toàn cục, hay sử dụng một bộ đếm cục bộ cho mỗi vị trí. Lúc này, một vị trí sẽ gắn thêm định danh danh của nó vào giá trị dấu thời gian. Dấu thời gian là một bộ <giá trị biến đếm cục bộ, định danh vị trí> .Khi hai giao dịch có cùng giá trị biến đếm, thì mới sử dụng đến định danh vị trí. Quy tắc xếp thứ tự như sau: Cho hai thao tác tương tranh Oij, Okl tương ứng với giao dịch Ti và Tk. Oij được thực hiện trước Okl nếu ts(Ti)<ts(Tk). Trong trường hợp này Ti được gọi là giao dịch già hơn và Tk được gọi là giao dịch trẻ hơn.
Một lịch biểu sẽ đối chiếu mỗi thao tác mới với các thao tác tương tranh đã xếp lịch. Nếu thao tác mới thuộc một giao dịch trẻ hơn so với giao dịch của tất cả các thao tác tương tranh đã sắp thì thao tác này được chấp nhận. ngược lại thì
Tuy vậy việc so sánh dấu thời gian chỉ được thực hiện nếu bộ xếp lịch nhận được tất cả các thao tác cần xếp lịch. Để dễ so sánh, mỗi mục dữ liệu x được gán một dấu đọc rts(x) là dấu thời gian lớn nhất trong số các dấu thời gian của các giao dịch đã đọc x và một dấu ghi wts(x) là dấu thời gian lớn nhất trong số các dấu thời gian của các giao dịch đã ghi x. Và khi đó ta có thể so sánh dấu thời gian của một thao tác với rts(x) và wts(x).
Điều khiển đồng thời theo quan điểm lạc quan
Trong các thuật toán trên, bản chất đều thuộc quan điểm bi quan. Việc thực hiện một thao tác của một giao dịch gồm 4 pha: thẩm tra V, đọc R, tính toán C và ghi W. Ngược lại, giao dịch lạc quan thì thứ tự 4 pha là R, C, V, W. Các thao tác không bao giờ bị trì hoãn. Các thao tác R, C được làm mà chưa cần kiểm tra.
Chỉ đến khi bắt đầu chuẩn bị W thì mới phải thẩm tra V. Nếu CSDL vẫn nhất quán thì cho phép W, nếu không thì giao dịch sẽ bị hủy và phải khởi động lại.
Quản lý khóa tắc nghẽn
Một khóa cài có thể xảy ra bởi các giao dịch phải chờ đợi lẫn nhau mà không giải quyết được. Một tình huống khóa tắc nghẽn là một tập các yêu cầu không bao giờ được đáp ứng do cơ chế điều khiển đồng thời. Khóa tắc nghẽn là một hiện tượng bền vững và không tự biến mất nếu không có sự can thiệp từ bên ngòai.
Một công cụ để phân tích khóa tắc nghẽn là đồ thị đợi WFG (wait for graph), Nó là một đồ thị có hướng biểu diễn mối liên hệ chờ đợi giữa các giao dịch. Một khóa tắc nghẽn xảy ra khi xuất hiện chu trình trong WFG. Trong môi trường phân tán, ta phải sử dụng đồ thị đợi toàn cục GWFG là hợp câu các WFG cục bộ.
Ba phương pháp để xử lý khóa tắc nghẽn là ngăn chặn khóa tắc nghẽn, tránh khóa tắc nghẽn, phát hiện và giải tỏa khóa tắc nghẽn.
Ngăn chặn khóa tắc nghẽn là để bảo đảm không xảy ra khóa tắc nghẽn.
Muốn thế bộ quản lý giao dịch phải kiểm tra một giao dịch khi nó bắt đầu và không cho phép nó tiến hành nếu như nó có thể gây ra khóa tắc nghẽn .
Tránh khóa tắc nghẽn: đơn giản nhất là xếp thứ tự các tài nguyên và yêu cầu mỗi tiến trình truy xuất đến tài nguyên phải theo thứ tự đó.
Phát hiện và giải tỏa khóa tắc nghẽn: Trước hết phải phân tích GWFG để xem có chu trình không. Chọn ra một hoặc nhiều giao dịch “nạn nhân” rồi tước quyền và hủy bỏ chúng nhằm phá vì chu trình.