Nếu cập nhật gặp lỗi, hãy nhảy ñến nhãn UNDO Thực hiện tất cả các thao tác trên tình từ lệnh bắt ñầu − Nếu ñã thực hiện thì phải thực hiện ñồng thời chèn và cập nhật; − Nếu một trong
Trang 1Bà i 9 – B ả o v ệ d ữ i ệ u
Trong bài này, chúng ta sẽ chú ý ñến vấn ñề bảo vệ dữ liệu, nghĩa là bảo vệ cơ sở
dữ liệu chống lại các nguy cơ tiềm ẩn (cố ý hoặc vô tình) làm cho dữ liệu bị hỏng hoặc bị mất Trong thực tế, có rất nhiều rủi ro và nguy cơ có thể xảy ra:
− Chương trình hệ thống ñang chạy bị treo ở gữa chừng, làm cho CSDL ở vào một trạng thái bất ñịnh
− Hai chương trình cùng chạy ñồng thời, tranh chấp hoặc can thiệp vào cùng một khối dữ liệu làm cho kết quả bị sai ñi
− Dữ liệu nhạy cảm bị lộ hoặc bị sửa ñổi bởi người dùng không có quyền, không ñược phép
− Các phép toán trên CSDL làm cho CSDL bị thay ñổi và ở một trạng thái không toàn vẹn, làm cho các ràng buộc trong CSDL bị phá vỡ
Và còn nhiều các nguy cơ khác nữa Từ ñó, HQT CSDL phải cung cấp nhiều bộ công cụ ñể khống chế và giảm thiểu các nguy cơ nêu trên Các vấn ñề lần lượt ñược ñề cập trong bài này sẽ là: Phục hồi dữ liệu, Xử lý tranh chấp, An toàn dữ liệu và Đảm bảo tính toàn vẹn
1./ Ph c h#i d& li)u
Phục hồi dữ liệu, theo nghĩa của CSDL là CSDL tự phục hồi về một trạng thái ổn ñịnh sau khi gặp lỗi hoặc khi toàn bộ CSDL gặp phải sự cố, làm cho CSDL không còn ñúng nữa Để thực hiện ñược việc này, kỹ thuật sơ ñẳng ñược áp dụng
là redundancy – nghĩa là tạo dữ liệu dư thừa, trùng lặp Nói theo một cách khác là mỗi một mẫu thông tin ñược tạo ra, sẽ có ít nhất là 2 nơi cất giữ: nơi lưu chính và nơi lưu dự phòng Nơi cất giữ dự phòng khác với nơi cất giữ chính, thường ñược
ẩn ñi, người dùng không biết
Chủ ñề về phục hồi dữ liệu là chủ về phục hồi dữ liệu chung cho bất cứ mô hình
cơ sở dữ liệu nào, có thể ứng dụng ñược cho mô hình CSDL quan hệ
1.1.- Giao dịch (transaction)
Một giao dịch có thể ñược hiểu là một công ñoạn logic không tách rời Công ñoạn này hoặc là thực hiện trọn vẹn, hoặc là không làm gì cả, không có trường hợp làm dở dang Hãy lấy một ví dụ Giả thiết là trong bảng part , ta thêm một trường có tên là totqty , là tổng số lượng phụ tùng ñã chuyển ñến từ các nhà cung cấp, tính theo mã phụ tùng Giả thiết là nhà cung cấp S5 cấp 1000 phụ tùng
P1
Trang 2Để thực hiện “giao dịch” này, về mặt logic, chúng ta sẽ làm hai việc nhỏ, ñó là:
1 Chèn thêm vào bảng sp các giá trị S5 , P1 , 1000;
2 Cộng thêm 1000 vào vào thuộc tính totqty của bản ghi có khóa là P1
trong bảng part
Ta hãy xem ñoạn mã giả lập sau ñây:
START TRANSACTION;
INSERT INTO sp (s_id, p_id, qty) VALUES ('S5', 'P1', 1000);
IF any error occurred THEN GO TO UNDO;
UPDATE part SET totqty = totqty+1000 WHERE p_id = 'P1';
IF any error occurred THEN GO TO UNDO;
Nếu chèn gặp lỗi, hãy nhảy ñến nhãn UNDO ;
Cập nhật trường totqty bằng cách cộng thêm 1000 vào giá trị của trường này, chỉ thực hiện ñối với bản ghi có khóa là P1
Nếu cập nhật gặp lỗi, hãy nhảy ñến nhãn UNDO
Thực hiện tất cả các thao tác trên tình từ lệnh bắt ñầu
− Nếu ñã thực hiện thì phải thực hiện ñồng thời chèn và cập nhật;
− Nếu một trong 2 thao tác này không thành công thì phải hủy bỏ toàn bộ; Một công ñoạn như trên ñược gọi là một giao dịch Nghĩa là một giao dịch luôn ñảm bảo chuyển CSDL từ trạng thái ổn ñịnh này sang môt trạng thái ổn ñịnh
Trang 3− Để bắt ñầu thực hiện một giao dịch, chúng ta sử dụng lệnh
START TRANSACTION hoặc lệnh BEGIN
− Sau khi thực hiện các thao tác không gặp lỗi nào, ta gọi lệnh COMMIT
− Nếu trong quá trình thực hiện các thao tác, ta gặp một lỗi nào ñó, ta gọi lệnh
ROLLBACK
Như vậy, chỉ sau khi có lệnh COMMIT các thay ñổi mới thực sự diễn ra Trước thời ñiểm ñó, các thay ñổi chỉ mang tính chất tạm thời Khi có lệnh ROLLBACK , các thay ñổi kể từ lệnh START TRANSACTION ñều bị hủy bỏ
Có thể chúng ta sẽ tò mò về mặt kỹ thuật, làm thế nào ñể thực hiện ñược lệnh
ROLLBACK Thông thường, người ta sử dụng một sổ nhật ký lệnh, ghi lại tất cả các giá trị trước và sau một lệnh Nhờ ñó, khi cần quay trở lại, người ta lần ngược
sổ nhật ký và cho phục hồi các giá trị trước ñó
Cần nói thêm rằng, các lệnh SQL ñều phải là các giao dịch, nghĩa là phải ñảm bảo tính nguyên tử - hoặc thực hiện thì thực hiện trọn vẹn, còn nếu không thì không thực hiện gì cả
ACID là viết tắt của các từ A tomicity, C onsistency, I solation và D urability
Atomicity (Tính nguyên tử): Tính trọn vẹn của xử lý: làm trọn vẹn hoặc không làm gì cả
Consistency (Tính nhất quán): Khi thực hiện các giao dịch, phải ñảm bảo CSDL luôn luôn ở trạng thái ổn ñịnh – nghĩa là các ràng buộc không bị phá vỡ
Trang 4Isolation (Tính biệt lập): các giao dịch biệt lập với nhau, không chồng chéo lên nhau Đây có một phần trách nhiệm của người lập trình, phải ñảm bảo rằng các giao dịch không xen nhau Nói một cách khác, giả thiết ta có 2 giao dịch là T1 và T2 thì T1 có thể ñược COMMIT trước hoặc T2 có thể COMMIT trước nhưng không ñược phép T1 và T2 COMMIT ñồng thời
Durability (Tính bền vững): Khi một giao dịch ñã thực hiện COMMIT , thì các cập nhật sẽ ñược giữ nguyên, mặc dù ngay sau ñó hệ thống có thể bị treo
2./ X+ lý tranh ch-p
Tranh chấp (concurrency) và phục hồi dữ liệu có mối liên kết mật thiết với nhau Tranh chấp xảy ra khi có nhiều giao dịch cùng truy cập ñồng thời vào cùng một tập hợp dữ liệu Trong trường hợp này, HQT CSDL phải có cơ chế ñảm bảo và kiểm soát ñược các giao dịch không can thiệp lẫn nhau, làm hỏng dữ liệu của nhau
Người ta nhận thấy có 3 vấn ñề chính trong tranh chấp có thể làm cho các giao dịch bị sai ñi Và từ ñó cần tìm ra cơ chế ñể giải quyết các vấn ñề ñã ñặt ra Các vấn ñề ñó là:
2 1.1 V ấ n ñề c ậ p nh ậ t m ấ t hi ệ u l ự c
( lost update problem)
Giả sử giao dịch A và giao dịch B diễn biến như trong hình vẽ sau, theo thứ tự thời gian và cùng tác ñộng lên bản ghi p
Trang 5( uncommitted dependency problem)
Vấn ñề này xảy ra khi một giao dịch trích xuất (hoặc cập nhật) một bản ghi mà bản ghi ñó ñược cập nhật bởi một giao dịch khác mà giao dịch khác này chưa ñược xử lý (COMMIT hoặc ROLLBACK) Xem tình huống này trong hình vẽ sau:
-
-
- t1
Trang 62 1.3 V ấ n ñề phép toán g ộ p không nh ấ t quán
( inconsistent analysis problem)
Để giải quyết vấn ñề tranh chấp, người ta thường sử dụng một kỹ thuật có tên gọi
là locking – khóa dữ liệu Ý tưởng rất ñơn giản: khi một giao dịch nào ñó muốn một phần nào ñó của CSDL không bị thay ñổi một cách không lường trước ñược, giao dịch ñó yêu cầu nhận một khóa (lock) Chẳng hạn, khi giao dịch A nhận ñược một khóa trên một bản ghi nào ñó, thì bản ghi ñó sẽ không bị các giao dịch nào khác ngaòi A thay ñổi trong quá trình A nhận khóa Ý nghĩa của khóa là một giao dịch khóa lại không cho các gia dịch khác tham gia vào
Phương thức khóa ñược tiến hành như sau:
Trang 71 Giả thiết rằng hệ thống có 2 loại khóa là khóa loại trừ - exclusive locks
(hay còn gọi là khóa ghi – write locks ), ký hiệu là khóa loại X và khóa chia sẻ - shared locks (hay còn gọi là khóa ñọc – read locks ) ký hiệu là laọi khóa S Chúng ta giả thiết thêm rằng, chỉ có các bản ghi mới là các ñối tượng có thể khóa ñược Giả thiết này chỉ mang ý nghĩa minh họa
2 Nếu giao dịch A ñã giữ ñược một khóa loại X của bản ghi p, thì bất kỳ một giao dịch B khác nếu yêu cầu khóa sẽ bị từ chối
3 Nếu giao dịch A giữ khóa S của bản ghi p thì có 2 trường hợp xảy ra:
− Nếu giao dịch B yêu cầu khóa X của bản ghi p thì sẽ bị từ chối;
− Nếu giao dịch B yêu cầu khóa S của bản ghi p thì sẽ ñược cấp (tức là B ñồng thời cũng ñược phép giữ khóa S )
Các qui tắc này ñược gói gọn như trong bảng tương thích sau:
Bảng này ñược giải thích như sau: giả thiết có một bản ghi p; giả thiết giao dịch
A giữ khóa ký hiệu trên hàng trên cùng của bảng ( gạch ngang (-) = không khóa); giả thiết giao dịch B muốn nhận một khóa ký hiệu trong cột trái cùng của bảng N
là ký hiệu B sẽ không nhận ñược khóa; Y ký hiệu B sẽ nhận ñược khóa
Bây giờ chúng ta ñưa vào giao thức truy cập dữ liệu, sử dụng các loại khóa X và
S ñể ñảm bảo các vấn ñề tranh chấp không xảy ra:
1 Nếu một giao dịch nào ñó muốn ñọc dữ liệu trên một bản ghi thì trước hết cần nhận khóa S ;
2 Nếu một giao dịch nào ñó muốn ghi dữ liệu lên bản ghi, cần trước hết nhận khóa X Mặc dù giao dịch ñó có thể ñã có khóa S , vẫn cần chuyển khóa S ñó sang khóa X
Chú ý: Việc nhận khóa trong một số trường hợp có thể ngầm ñịnh: trước
khi ñọc dữ liệu một số hệ thống có thể ngầm ñịnh là thêm yêu cầu khóa S Tương tự như vậy, trước khi ghi, có thể ngầm ñịnh yêu cầu khóa X Ghi dữ liệu ñồng nghĩa với việc sử dụng môt trong các lệnh INSERT, DELETE và UPDATE
3 Nếu một giao dịch B yêu cầu nhận khóa và bị từ chối, thì B sẽ ở vào trạng thái ñợi cho ñến khi giao dịch A nhả khóa
Chú ý: Hệ thống phải ñảm bảo B không ñợi ñến vô tận Một trong những
Giao dịch A
Giao dịch B
Trang 8kỹ thuật ñể ñảm bảo việc ñợi vô tận không xảy ra là ai ñến trước ñược cấp trước
4 Nhìn chung, các khóa cần ñược giữ cho ñến lúc thực hiện lệnh COMMIT
hoặc thực hiện lệnh ROLLBACK
Sau khi ñưa vào khái niệm khóa, chúng ta thử tìm cách giải quyết ba vấn ñề tranh chấp ñã nêu ở phần trên
2 3.1 V ấ n ñề c ậ p nh ậ t m ấ t hi ệ u l ự c
( lost update problem)
Giả sử giao dịch A và giao dịch B diễn biến như trong hình vẽ sau, theo thứ tự thời gian và cùng tác ñộng lên bản ghi p
2 3.2 V ấ n ñề tính ph ụ thu ộ c giao d ị ch ch ư a x ử lý
( uncommitted dependency problem)
Vấn ñề này xảy ra khi một giao dịch trích xuất (hoặc cập nhật) một bản ghi mà bản ghi ñó ñược cập nhật bởi một giao dịch khác mà giao dịch khác này chưa ñược xử lý (COMMIT hoặc ROLLBACK) Xem tình huống này trong hình vẽ sau:
Trang 9Giao d ị ch A T Giao d ị ch B
-
-
- t1
C ậ p nh ậ t p
Trong cả 2 trường hợp trong hình vẽ trên, ñến thời ñiểm t2, giao dịch A phải ñợi
vì giao dịch B ñã có khóa X Khi B ñến thời ñiểm hoặc COMMIT hoặc ROLLBACK, B nhả khóa và lúc ñó A mới nhận ñược khóa
Trang 102 3.3 V ấ n ñề phép toán g ộ p không nh ấ t quán
( inconsistent analysis problem)
Và ở ñây, một tình thế tương tự xảy ra: tắc nghẽn (deadlock) A và B khóa lẫn nhau
Trang 112.4.- Tắc nghẽn (deadlock)
Đến lúc này, chúng ta nhận thấy là kỹ thuật dùng khóa sẽ tránh ñược các vấn ñề tranh chấp nhưng ñồng thời nó cũng sinh ra vấn ñề của chính nó: tắc nghẽn (deadlock): các giao dịch khóa lẫn nhau
Xét các trường hợp trên, chúng ta hiểu tắc nghẽn là một tình huống mà ở ñó các giao dịch ñợi lẫn nhau Không phải chỉ có 2 giao dịch ñợi lẫn nhau mà trong một
số trường hợp, có thể có 3, 4, giao dịch ñợi lẫn nhau, chờ nhau nhả khóa
Đây là vấn ñề khá kinh ñiển trong xử lý hệ thống – không chỉ HQT CSDL gặp phải mà còn có cả ở các lĩnh vực khác, chẳng hạn như hệ ñiều hành
Nếu tắc nghẽn xảy ra, thì thông thường chỉ có các phần mềm thuộc hệ thống mới
có khả năng tháo gỡ Cách gỡ khóa phổ biến nhất là người ta chọn một nạn nhân theo qui tắc ngẫu nhiên và cho nạn nhân ñó ROLLBACK Sau khi ROLLBACK, nạn nhân này sẽ nhả khóa (sau khi ROLLBACK, các giao dịch sẽ tự ñộng nhả khóa)
Cách xử lý hậu quả của nạn nhân cũng tùy chiến lược xử lý của từng hệ thống
Có hệ thống sẽ tự ñộng cho xử lý lại giao dịch Có hệ thống chỉ báo lỗi cho chương trình (tiến trình) Sau ñó là tùy chương trình (tiến trình) Chương trình (tiến trình) phải tự có phương án xử lý
Khi xét vấn ñề tranh chấp trong xử lý các giao dịch, nảy ra một vấn ñề khác là: khi xử lý ñan xen như vậy, liệu các thuật toán ñó có ñúng hay không, với giả thiết khi không chạy ñan xen, bản thân các thuật toán ñó là ñúng?
Khả năng tuần tự hóa (serializability) là một khái niệm về các tiêu chuẩn ñảm bảo xử lý các tranh chấp là ñúng (thuật toán chạy ñúng)
Hiện nay, nhìn chung người ta chấp nhận một xử lý ñan xen mà cho kết quả giống hệt như xử lý theo tuần tự tách rời, từng giao dịch một, thì xử lý ñan xen
ñó cho kết quả ñúng Nói một cách khác:
1 Giả thiết rằng các giao dịch nếu viết tách rời cho kết quả ñúng, nghĩa là chúng chuyển CSDL từ một trạng thái ổn ñịnh này sang một trạng thái ổn ñịnh khác
2 Vì vậy, nếu chạy tách rời từng giao dịch một theo tuần tự, chúng ta cũng
sẽ ñược kết quả ñúng Giả thiết là các giao dịch hoàn toàn ñộc lập với nhau
Trang 123 Một xử lý xen kẽ các giao dịch ñược gọi là ñúng nếu nó tương ñương với một tổ hợp xử lý tuần tự nào ñó
Quay trở lại ba vấn ñề tranh chấp, các xử lý ñan xen ñó không chạy ñúng khi
không tuần tự hóa ñược, nghĩa là chúng ta không tách ñược xử lý A rồi ñến B hoặc xử lý B rồi ñến A Để tháo gỡ deadlock, người ta chọn nạn nhân ñể
ROLLBACK Cách này về bản chất cũng là cách tuần tự hóa các giao dịch
Một vài ñịnh nghĩa: Lịch xử lý = tổ hợp các giao dịch; Lịch xử lý tuần tự = tổ hợp các giao dịch tách rời và tuần tự; Lịch xử lý ñan xen nếu các giao dịch ñan xen;
Hai lịch ñược gọi là tương ñương nếu nó cho cùng một kết quả, nghĩa là cùng một trạng thái ổn ñịnh của CSDL
Điểm ñáng lưu ý là hai lịch xử lý của cùng một tập hợp các giao dịch có thể cho
kết quả khác nhau Ví dụ, giao dịch A là “Thêm 1 vào x” và giao dịch B là “Nhân
ñôi x”, x là một giá trị thuộc CSDL Giả thiết rằng giá trị lúc ñầu của x là 10 Nếu
ta chọn lịch A rồi ñến B thì cho kết quả là x=22 trong lúc ñó nếu chọn B rồi ñến
Giao thức khóa 2 pha ñược ñịnh nghĩa như sau:
1 Trước khi tác ñộng lên bất cứ ñối tượng nào, giao dịch cần nhận ñược khóa của ñối tượng ñịnh xử lý;
2 Sau khi nhả khóa, thì giao dịch ñó không bao giờ ñược nhận lại khóa một lần nữa
Nếu một giao dịch nào ñó tuân thủ giao thức này thì giao thức sẽ gồm 2 pha: pha nhận khóa và pha nhả khóa
Ý nghĩa của giao thức này là nguyên tắc rất ñơn giản và ñảm bảo ñược tính ñúng ñắn của một thuật toán
Điểm ñáng lưu ý nữa là nếu không tuân thủ giao thức 2 pha, các giao dịch ñan xen có khả năng sẽ tạo ra một cấu trúc mắc lỗi tranh chấp
Trang 133./ An toàn d& li)u
An toàn dữ liệu thường gắn liền với bảo mật (an ninh) và ñảm bảo tính toàn vẹn của dữ liệu Bảo mật = cho phép và không cho phép ñối tượng truy cập dữ liệu; Tính toàn vẹn = ñộ chính xác và tính hợp lệ của dữ liệu
1 Bảo mật là hệ thống cấp phép các ñối tượng các quyền họ ñược phép thực
Bảo mật thường gắn với các qui ñịnh và giải pháp khác ngoài HQT CSDL:
− Về mặt xã hội, có thể có các luật qui ñịnh các hình phạt ñối với những kẻ cố tình vi phạm;
− Về mặt doanh nghiệp, có thể có các chế tài ñối với nhân viên vi phạm các qui tắc ñã ñề ra;
− Hệ ñiều hành cũng có các phương án riêng ñể bảo mật ở mức hệ thống
Trong các mô hình kiểm soát truy cập dữ liệu hiện nay, phần lớn ñều chọn cách tiếp cận tùy biến giữa ba lớp ñối tượng ñó là: người dùng (user), ñối tượng dữ liệu và quyền truy xuất, như trong hình vẽ sau
Lưu ý rằng mục tiêu của bảo mật là: chỉ cho phép người dùng thực hiện những gì
ñã ñược cấp phép
Người dùng
Quyền truy xuất
Dữ liệu