AAAAAAAAAA1
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Chương 1
TỔNG QUAN
1.1. Các khó khăn trên hệ thống xử lý file truyền thống
Cách tiếp cận truyền thống đối với các hệ thống thông tin thường chỉ tập trung
vào các nhu cầu xử lý dữ liệu của các phòng riêng lẻ trong một tổ chức mà không xem
xét tổ chức này như là một tổng thể. Các hệ thống thông tin này đáp ứng các yêu cầu
của những người sử dụng bằng cách viết một chương trình mới đối với mỗi ứng dụng
riêng lẻ, thường là một chương trình được phát triển tại một thời điểm. Mỗi chương
trình ứng dụng hay một hệ thống theo yêu cầu sẽ được thiết kế để đáp ứng các yêu
cầu của một phòng đặc biệt hay một nhóm người sử dụng cụ thể. Do vậy, không có
một kế hoạch tổng thể hay một mô hình hướng đến sự tăng trưởng các ứng dụng mới
trong tương lai.
Mỗi ứng dụng tin học mới được thiết kế một cách điển hình với một tập các
file dữ liệu riêng của nó. Nhiều dữ liệu trong các file mới có thể đã xuất hiện trong
các file đang tồn tại sẽ phải được cấu trúc lại, mà đến lược nó, các chương trình đang
tồn tại sử dụng cùng các file này cũng phải được sửa lại hay viết lại hoàn toàn. Với lý
do này, thiết kế các file mới với mỗi ứng dụng được yêu cầu thường là đơn giản hơn
và cũng ít rủi ro hơn.
Ví dụ 1.1. Xem xét một phần của hệ thống Quỹ tiết kiệm trong Ngân hàng lưu
giữ thông tin về khách hàng và các tài khoản tiết kiệm của Ngân hàng. Một cách để
lưu trữ thông tin này trên máy tính là lưu trữ nó trong các file hệ thống bền vững. Để
cho phép người sử dụng thao tác những thông tin này, hệ thống có một số các chương
trình ứng dụng thao tác các file đó, chẳng hạn như:
Chương trình thêm một tài khoản mới.
Chương trình ghi nợ (ghi có) một tài khoản
Chương trình tính số dự của một tài khoản.
Các chương trình ứng dụng này được viết bởi các nhà lập trình hệ thống để đáp
ứng các yêu cầu tin học hoá của Ngân hàng.
Các chương trình ứng dụng mới có thể bổ sung thêm vào hệ thống khi các nhu
cầu mới nảy sinh.
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Hệ thống xử lý file điển hình vừa mô tả được hỗ trợ bởi một hệ điều hành nào
đó. Các bản ghi khá ổn định và tồn tại lâu dài được lưu trữ trong các file khác nhau và
các chương trình ứng dụng khác nhau được viết để trích ra các bản ghi từ các file
thích hợp hay bổ sung thêm các bản ghi mới vào các file đó.
Tuy nhiên, khi qui mô kinh doanh của các tổ chức và nhu cầu xử lý thao tác dữ
liệu với các mục đích khác nhau theo các qui định khác nhau tăng lên, một số vấn đề
nghiêm trọng có thể nảy sinh.
Các hệ thống trên cơ sở file được phát triển với các ứng dụng đặc biệt, do vậy
việc lưu trữ thông tin của các tổ chức trong các hệ thống file có một số bất lợi chính
sau:
Dư thừa dữ liệu và tính không nhất quán dữ liệu: Do các file và các
chương trình ứng dụng được tạo lập bởi các nhà lập trình khác nhau trong khoảng thời
gian dài, các file khác nhau có thể có các qui cách khác nhau và các chương trình có
thể được viết bằng một số ngôn ngữ lập trình khác nhau. Hơn nữa, vì các file được tạo
lập đối với mỗi chương trình ứng dụng riêng, do vậy cùng một tập các dữ liệu của tổ
chức có thể được lưu trữ lại trong mỗi chương trình ứng dụng, có nghĩa là một số
thông tin có thể lặp lại trên một số file khác nhau và các tài nguyên phần cứng sẽ bị
lãng phí.
Ví dụ 1.2. Địa chỉ, số điện thoại của một khách hàng đặc biệt có thể xuất hiện
trong một file chứa các bản ghi tài khoản tiết kiệm và trong một file chứa các bản ghi
số dư tài khoản. Sự dư thừa này den đến giá truy nhập và giá lưu trữ cao hơn.
Vì các dữ liệu được lưu trữ trong các file có thể được thay đổi một cách độc
lập bới các chương trình ứng dụng sử dụng chúng, nội dung của các khoản mục dữ
liệu trong chương trình ứng dụng này có thể không trình với cùng các khoản mục dữ
liệu đó trong một chương trình ứng dụng khác. Điều này den đến tính không nhất
quán dữ liệu, có nghĩa là các bản sao khác nhau của cùng một khoản mục dữ liệu
không giống nhau.
Ví dụ 1.3. Địa chỉ của khách hàng bị thay đổi trong bản ghi tài khoản tiết kiệm
nhưng không được phản ánh trong bản ghi số dư tài khoản đối với khách hàng đó.
Khó khăn trong truy nhập dữ liệu: Giả sử rằng một trong các nhân viên của
Ngân hàng cần tìm danh sách tên các khách hàng sống trong một thành phố nào đó.
Nhân viên này hfi phòng xử lý dữ liệu để đưa ra một danh sách như vậy. Vì yêu cầu
này không được dự tính trước, hệ thống gốc được thiết kế không có sgn một chương
5
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
trình ứng dụng để đáp ứng yêu cầu này. Tuy nhiên, có một chương trình ứng dụng
đưa ra tất cả danh sách các khách hàng. Bấy giờ, nhân viên Ngân hàng đứng trước 2
sự lựa chọn: Hoặc sử dụng danh sách tất cả khách hàng và trích ra những thông tin
cần thiết bằng tay hoặc nhờ phòng xử lý dữ liệu đề nghị một nhà lập trình hệ thống
viết chương trình ứng dụng mới để đáp ứng yêu cầu này. Cả hai lựa chọn hiển nhiên
đều không được thoả mãn. Giả sử rằng, một chương trình như vậy được viết, và sau
vài ngày, cũng nhân viên đó cần một danh sách khác. Cũng như vậy, một chương
trình đưa ra danh sách đó không tồn tại và nhân viên này lại đứng trước hai sự lựa
chọn và không lựa chọn nào thoả mãn. Điều này có thể nói rằng môi trường xử lý file
không cho phép các dữ liệu cần thiết được tìm kiếm trong một phương pháp hiệu quả
và tiện lợi.
Cô lập và hạn chế chia sẽ dữ liệu: Với phương pháp tiếp cận truyền thống,
mỗi ứng dụng có các file dữ liệu riêng của nó và những người sử dụng ít có cơ sở dữ
liệu hội chia sẽ dữ liệu ngoài các ứng dụng riêng của họ. Một hậu quả của việc chia sẽ
dữ liệu bị hạn chế là cùng các dữ liệu phải lưu trữ trong nhiều file ứng với các ứng
dụng khác nhau do khi thiết kế phát triển các ứng dụng mới, người thiết kế thường
khó khai thác các dữ liệu chứa trong các file đang tồn tại trong khi các file mới được
thiết kế lặp lại nhiều dữ liệu đang tồn tại.
Các vấn đề về toàn vẹn: Các giá trị dữ liệu được lưu trữ trong cơ sở dữ liệu
phải thoả mãn các kiểu ràng buộc toàn vkn nhất định. Các nhà phát triển làm hiệu lực
các ràng buộc này trong hệ thống bằng cách thêm các đoạn mã tương ứng vào các
chương trình ứng dụng. Tuy nhiên, khi các ràng buộc mới được bổ sung thêm đối với
cơ sở dữ liệu, sẽ rất khó thay đổi các chương trình để làm hiệu lực các ràng buộc mới
này. Vấn đề này phức tạp hơn khi các ràng buộc đó lôi kéo một số khoản mục dữ liệu
từ các file khác nhau.
Các vấn đề về độ tin cậy: Một hệ thống máy tính cũng như một thiết bị điện
tử hay cơ sở dữ liệu học nào đó có thể bị lỗi. Trong nhiều ứng dụng, vấn đề mấu chốt
là khi một lỗi xuất hiện và được dò tìm phát hiện, dữ liệu phải được phục hồi đến
trạng thái toàn vkn tồn tại trước khi xảy ra lỗi.
Ví dụ 1.4. Xét chương trình ứng dụng chuyển 500USD từ tài khoản A đến tài
khoản B. Nếu hệ thống xảy ra lỗi khi thực hiện chương trình, có thể rằng, 500USD đã
chuyển đi từ tài khoản A những chưa được ghi có vào tài khoản B, kết quả là cơ sở dữ
liệu ở trong một trạng thái không toàn vkn dữ liệu.
6
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Các dị thường truy nhập đồng thời: Để tăng hiệu năng tổng thể của hệ
thống và thời gian đáp ứng nhanh nhất có thể, nhiều hệ thống cho phép nhiều người
sử dụng truy nhập dữ liệu đồng thời. Trong một môi trường như vậy, sự tương tác của
các truy nhập đồng thời có thể den đến kết quả của một trạng thái không toàn vkn dữ
liệu.
Ví dụ 1.5. Xét tài khoản Ngân hàng A có 5000USD. Nếu hai khách hàng đến
rút quỹ ( Rút 50USD và 100 USD tương ứng) từ tài khoản A vào cùng một thời điểm.
Kết quả của các thực hiện đồng thời này có thể den đến tài khoản này ở trong một
trạng thái không đúng đsn (hay không toàn vkn). Giả sử rằng, các chương trình rút
thực hiện yêu cầu rút bao gồm các thao tác: đọc giá trị tài khoản, giảm giá trị này đi
một giá trị bằng số tiền cần rút và ghi kết quả trả lại. Nếu hai chương trình chạy đồng
thời, cả hai có thể cùng đọc 500USD và ghi lại 450USD, 400USD tương ứng. Phụ
thuộc vào chương trình nào ghi giá trị sau cùng, tài khoản A có thể chứ 450USD hoặc
400USD chứ không phải giá trị đúng của nó là 350USD.
Các vấn đề về an toàn: Không phải mọi người sử dụng của hệ thống đều có
thể truy nhập tất cả dữ liệu trong hệ thống.
Ví dụ 1.6. Trong hệ thống Ngân hàng, các nhân viên tài vụ của Ngân hàng chỉ
cần nhìn thấy một phần của cơ sở dữ liệu chứa thông tin về nhân viên khách hàng. Họ
không cần thiết truy nhập vào thông tin về các tài khoản khách hàng. Do các chương
trình ứng dụng được bổ sung vào hệ thống theo phương pháp thêm dần, việc bst tuân
thủ các ràng buộc an toàn như vậy là khá khó khăn.
Sự phụ thuộc dữ liệu của các chương trình ứng dụng: Do định nghĩa file
được chứa trong các chương trình ứng dụng, nếu các nội dung file và các khuôn dạng
bản ghi cần được thay đổi, các chương trình ứng dụng cũng phải thay đổi theo
1.2. Các hệ cơ sở dữ liệu
1.2.1. Các khái niệm cơ bản
Cơ sở dữ liệu là gì?
Một tổ chức (Xí nghiệp, trường học, Ngân hàng.....) có nhiều ứng dụng tin học
khác nhau nhưng tất cả các ứng dụng đó cùng được tiến hành trên một nguồn dữ liệu
chung thì không gì tốt hơn là triển khai các ứng dụng đó trên một cơ sở dữ liệu sở dữ
liệu hợp nhất cho phép quản lý tập trung tất cả dữ liệu xí nghiệp.
7
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Các chương trình ứng dụng Người sử dụng trực tuyến
Hình 1.1. Cơ sở dữ liệu hợp nhất
Trên hình vẽ 1.1, chúng ta nhìn thấy thành phần cơ sở dữ liệu hợp nhất là một
bộ sưu tập các dữ liệu chứa trên các phương tiện lưu trữ như đĩa từ hay băng
từ...Những người sử dụng trực tuyến hay các chương trình ứng dụng có thể sử dụng
chung hay chia sẽ cơ sở dữ liệu này.
Có thể thực hiện các thao tác tìm kiếm, sửa đổi, bổ sung...
Như vậy, có thể định nghĩa: Cơ sở dữ liệu là một bộ sưu tập các dữ liệu tác
nghiệp được lưu trữ lại và được các hệ ứng dụng của một cơ quan cụ thể nào đó sử
dụng.
Như thế, có thể định nghĩa hệ cơ sở dữ liệu là một hệ thống gồm 4 thành phần:
Cơ sở dữ liệu hợp nhất: Cơ sở dữ liệu của hệ có 2 tính chất tối thiểu hoá dư
thừa và được chia sẻ.
Người sử dụng: Bao gồm những người truy cập vào cơ sở dữ liệu, những
người viết các chương trình ứng dụng và những người điều khiển toàn bộ hệ thống
hay còn gọi là người quản trị cơ sở dữ liệu.
Phần mềm hệ quản trị cơ sở dữ liệu.
Phần cứng.
Hệ quản trị cơ sở dữ liệu là gì?
Hệ quản trị cơ sở dữ liệu là một hệ thống phần mềm cho phép tạo lập cơ
sở dữ liệu và điều khiển mọi truy nhập đối với cơ sở dữ liệu đó.
1.2.2. Các khả năng của một hệ quản trị cơ sở dữ liệu
8
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Có hai khả năng cho phép phân biệt các hệ quản trị cơ sở dữ liệu với các kiểu
hệ thống lập trình khác:
Khả năng quản dữ liệu tồn tại lâu dài.
Đặc điểm này nói lên rằng có một cơ sở dữ liệu tồn tại trong một thời gian dài,
nội dung cơ sở dữ liệu này là các dữ liệu mà một hệ quản trị cơ sở dữ liệu truy nhập
và quản lý.
Khả năng truy nhập các khối lượng dữ liệu lớn một cách hiệu quả.
Đặc điểm này phân biệt một hệ quản trị với một hệ thống xử lý file cũng quản
lý dữ liệu tồn tại lâu dài nhưng nói chung không cung cấp các truy nhập nhanh chóng
đến các bộ phận dữ liệu tuỳ ý.
Ngoài ra, khi xem xét đặc điểm của hệ quản trị cơ sở dữ liệu còn có một số khả
năng khác mà có thể thấy hầu hết trong các hệ quản trị cơ sở dữ liệu thương mại:
Hỗ trợ ít nhất một mô hình dữ liệu hay một sự trừu tượng toán học mà qua
đó người sử dụng có thể quan sát dữ liệu.
Đảm bảo tính độc lập dữ liệu.
Hỗ trợ các ngôn ngữ cấp cao nhất định cho phép người sử dụng định nghĩa
cấu trúc của dữ liệu, truy nhập dữ liệu và thao tác dữ liêu.
Quản trị giao dịch, có nghĩa là cung cấp các truy nhập đồng thời, đúng đsn
đối với cơ sở dữ liệu từ nhiều người sử dụng tại một thời điểm.
Điều khiển truy cập, có nghĩa là khả năng hạn chế truy cập đến các dữ liệu
bởi những người sử dụng không được cấp phép và khả năng kiểm tra tính đúng đsn
của dữ liệu.
Phục hồi dữ liệu, có nghĩa là khả năng phục hồi, không làm mất mát dữ liệu
đối với các lỗi hệ thống.
a . Sự trừu tượng hoá dữ liệu.
Để cho hệ thống có thể sử dụng được, nó phải tra cứu hay tìm kiếm dữ liệu
một cách hiệu quả. Điều này den đến việc thiết kế các cấu trúc dữ liệu phức tạp để
biểu dixn dữ liệu trong cơ sở dữ liệu này. Do nhiều người truy nhập vào các hệ cơ sở
dữ liệu không được đào tạo về máy tính, người phát triển phải che dấu tính phức tạp
đối với những người sử dụng thông qua một số mức trừu tượng để dơn giản hoá các
tương tác của người sử dụng đối với hệ thống.
9
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Mức vật lý: Mức thấp nhất của sự trừu tượng mô tả dữ liệu được lưu trữ một
cách thực sự như thế nào? Tại mức vậy lý, các cấu trúc dữ liệu mức thấp phức tạp
được mô tả chi tiết.
Mức logic:Mức cao hơn tiếp theo của sự trừu tượng mô tả những dữ liệu nào
được lưu trữ trong cơ sở dữ liệu và các mối quan hệ nào tồn tại giữa các dữ liệu này.
Mức logic của sự trừu tượng được xác định bởi người quản trị cơ sở dữ liệu, cụ thể
phải quyết định những thông tin gì được lưu trữ trong cơ sở dữ liệu.
Mức khung nhìn: Mức cao nhất của sự trừu tượng mô tả chỉ một phần của toàn
bộ cơ sở dữ liệu. Mặc dù sử dụng các cấu trúc đơn giản hơn mức logic, một số phức
tạp ven còn tồn tại do kích thước lớn của cơ sở dữ liệu. Nhiều người sử dụng của hệ
cơ sở dữ liệu không quan tâm đến tất cả những thông tin này. Thực chất, những người
sử dụng này chỉ cần truy nhập một phần cơ sở dữ liệu. Do vậy sự tương tác của họ với
hệ thống này được đơn giản hoá và mức khung nhìn của sự trừu tượng được xác định.
Hệ thống có thể cung cấp nhiều khung nhìn đối với cùng một cơ sở dữ liệu..
Mối quan hệ giữa 3 mức trừu tượng được minh hoạ trong hình 2.
Khung nhìn 1 Mức khung nhìn Khung nhìn n
Mức Vật lý
Mức Logic
Hình 1.2. Ba mức trừu tượng dữ liệu
Sự tương tự đối với khái niệm các kiểu dữ liệu trong các ngôn ngữ lập trình có thể
làm sáng tf sự phân biệt giữa các mức trừu tượng.
Ví dụ 1.7 Trong ngôn ngữ lập trình Pascal chúng ta khai báo một bản ghi như sau:
Type Khachhang=record
Hoten:String;
The_BH:String;
T_Pho:String;
Duong_pho:String;
End;
10
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Đoạn mã này định nghĩa một kiểu bản ghi Khachhang với 4 trường. Mỗi
trường có một kiểu dữ liệu. Một Ngân hàng tiết kiệm có thể có một bản ghi như vậy,
chẳng hạn như sau:
Taikhoan(tài khoản) với các trường So_taikhoan và Doi_ung.
Nhanvien (Nhân viên) với các trường Hotennvien và Luong.
Tại mức vật lý, một bản ghi Khachhang, Taikhoan hay Nhanvien có thể được
mô tả như một khối nhớ. Chương trình dịch ngôn ngữ này che dấu các mức chi tiết
này đối với người lập trình. Tương tự, các hệ cơ sở dữ liệu che dấu nhiều chi tiết lưu
trữ thấp nhất đối với người lập trình ứng dụng. Người quản trị cơ sở dữ liệu có thể
biết những chi tiết nhất định về tổ chức dữ liệu vật lý. Tại mức logic, mỗi bản ghi như
vậy được mô tả bởi định nghĩa kiểu như được minh họa trong đoạn mã trên và mối
quan hệ giữa các kiểu bản ghi này được xác định. Những người lập trình cũng như
người quản trị thường làm việc tại mức trừu tượng này.
Mức khung nhìn, những người sử dụng máy tính nhìn thấy một tập các chương
trình ứng dụng mà che dấu những chi tiết về các kiểu dữ liệu. Tương tự, tại mức
khung nhìn, một số khung nhìn của cơ sở dữ liệu được xác định và những người sử
dụng cơ sở dữ liệu nhìn thấy các khung nhìn này. Ngoài sự che dấu những chi tiết của
mức logic đối với cơ sở dữ liệu này, các khung nhìn cũng cung cấp một cơ sở dữ liệu
chế an toàn để ngăn chặn những người sử dụng khfi sự truy nhập các bộ phận dữ liệu.
Ví dụ 1.8. Một khách hàng của một Ngân hàng chỉ nhìn thấy một phần cơ sở dữ liệu
chứa thông tin về tài khoản của anh ta và anh ta không thể truy nhập đến các thông tin
liên quan đến lương của các nhân viên Ngân hàng.
Các thể hiện và các sơ đồ
Các cơ sở dữ liệu thay đổi theo thời gian khi thông tin được thêm vào hay xóa
đi. Tập hợp các thông tin được lưu trữ trong cơ sở dữ liệu tại một thời điểm đặc biệt
gọi là một thể hiện của cơ sở dữ liệu sở dữ liệu. Một thiết kế tổng thể của cơ sở dữ
liệu gọi là sơ đồ cơ sở dữ liệu. Các sơ đồ ít khi bị thay đổi, thậm chí không thay đổi.
Tính độc lập dữ liệu
Khả năng thay đổi một định nghĩa sơ đồ trong một mức mà không ảnh hưởng
đến định nghĩa sở đồ trong mức cao hơn tiếp theo gọi là tính độc lập dữ liệu. Có hai
mức độc lập dữ liệu.
11
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Độc lập dữ liệu ở mức vật lý là khả năng thay đổi sơ đồ vật lý mà không den
đến các chương trình ứng dụng phải viết lại. Các thay đổi ở mức vật lý đôi khi là cần
thiết để tăng hiệu năng hệ thống.
Độc lập dữ liệu ở mức logic là khả năng thay đổi sơ đồ logic mà không den
đến các chương trình ứng dụng phải viết lại. Các thay đổi tại mức logic là cần thiết
bất kể khi nào cấu trúc logic của cơ sở dữ liệu bị sửa đổi. Chẳng hạn như khi các tài
khoản được thêm vào hệ thống Ngân hàng.
Độc lập dữ liệu mức logic là khó đạt được hơn so với độc lập dữ liệu mức vật
lý do các chương trình ứng dụng phụ thuộc nhiều vào cấu trúc logic của dữ liệu mà họ
đang truy nhập.
b. Các ngôn ngữ cơ sở dữ liệu
Một hệ cơ sở dữ liệu cung cấp hai kiểu ngôn ngữ khác nhau: Một ngôn ngữ đặc
tả sơ đồ cơ sở dữ liệu và một ngôn ngữ biểu dixn các truy vấn và các cập nhật dữ liệu.
Ngôn ngữ định nghĩa dữ liệu (Data Definition Language-DDL)
Một sơ đồ cơ sở dữ liệu đặc tả bởi một tập các định nghĩa được biểu dixn bởi một
ngôn ngữ đặc biệt gọi là ngôn ngữ định nghĩa dữ liệu. Kết quả việc dịch các lệnh của
ngôn ngữ này là một tập các bảng được lưu trữ trong một file đặc biệt gọi là từ điển
dữ liệu ha thư mục dữ liệu.
Ngôn ngữ thao tác dữ liệu (Data Manipulation Language-DML)
Các mức trừu tượng mà chúng ta đã thảo luận trong phần trước không chỉ áp
dụng đối với định nghĩa và cấu trúc dữ liệu mà đối với cả thao tác dữ liệu. Các yêu
cầu thao tác dữ liệu bao gồm:
Tìm kiếm thông tin được lưu trữ trong cơ sở dữ liệu.
Thêm thông tin mới vào cơ sở dữ liệu.
Xóa thông tin từ cơ sở dữ liệu sở dữ liệu.
Thay đổi thông tin được lưu trữ trong cơ sở dữ liệu.
Một ngôn ngữ thao tác dữ liệu là một ngôn ngữ cho phép những người sử dụng
truy nhập hay thao tác dữ liệu được tổ chức bởi một mô hình dữ liệu thích hợp. Có hai
kiểu ngôn ngữ thao tác dữ liệu cơ sở dữ liệu bản.
Các DML thủ tục đòi hfi một người sử dụng phải đặc tả dữ liệu nào cần tìm
kiếm và tìm kiếm những dữ liệu này như thế nào?
Các DML phi thủ tục đòi hfi một người sử dụng phải đặc tả dữ liệu nào cần
tìm kiếm và tìm kiếm mà không phải đặc tả những dữ liệu này như thế nào?
12
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
c. Xử lý câu hỏi
Công việc của bộ xử lý câu hfi là biến đổi một truy vấn hay một thao tác cơ sở
dữ liệu được biểu dixn tại một mức rất cao (Ví dụ như biểu dixn bởi một DML nào
đó) thành một dãy các yêu cầu đối với các dữ liệu được lưu trữ trong cơ sở dữ liệu.
Thường phần khó nhất của nhiệm vụ xử lý câu hfi là tối ưu hóa câu hfi, có nghĩa là
lựa chọn một kế hoạch thực hiện tốt nhất hay lựa chọn một dãy các yêu cầu đối với hệ
thống lưu trữ để trả lời truy vấn này nhanh nhất. Các truy vấn phức tạp thường cho
phép chúng ta ssp xếp lại trình tự các phép toán và có thể có một số lớn các kế hoạch
thực hiện có thể.
d. Quản trị giao dịch
Các hệ cơ sở dữ liệu cho phép người sử dụng nhóm một hay nhiều thao tác tra
cứu hay thay đổi cơ sở dữ liệu thành một giao dịch.
Một giao dịch là tập hợp các thao tác mà được xử lý như một đơn vị không
chia cst được. Thông thường, một số thao tác trên cơ sở dữ liệu tạo thành một đơn vị
logic công việc. Ta hãy xét ví dụ chuyển khoản, trong đó một số tiền x được
chuyển từ tài khoản A (A:=A-x ) sang một tài khoản B ( B:=B+x ). Một yếu tố cần
thiết là cả hai thao tác này hoặc cùng xảy ra hoặc không hoạt động nào xảy ra cả.
Việc chuyển khoản phải xảy ra trong tính toàn thể của nó hoặc không. Đòi hfi toàn
thể-hoặc-không này được gọi là tính nguyên tử. Một yếu tố cần thiết khác là sự thực
hiện việc chuyển khoản bảo tồn tính nhất quán của cơ sở dữ liệu: giá trị của tổng A +
B phải được bảo tồn. Đòi hfi về tính chính xác này được gọi là tính nhất quán.
Cuối cùng, sau khi thực hiện thành công hoạt động chuyển khoản, các giá trị của
account A và B phải bền vững cho dù có thể có sự cố của hệ thống. Đòi hfi về
tính bền vững này được gọi là tính lâu bền. Sự đảm bảo tính chất này là trách nhiệm
của thành phần quản trị giao dịch. Nếu không có sự cố, tất cả giao dịch hoàn tất thành
công và tính nguyên tử được hoàn thành dx dàng. Tuy nhiên, do các sự cố, một giao
dịch có thể không hoàn tất thành công sự thực hiện của nó. Nếu tính nguyên tử được
đảm bảo, một giao dịch thất bại không gây hiệu quả đến trạng thái của cơ sở dữ liệu.
Như vậy, cơ sở dữ liệu phải được hoàn lại trạng thái của nó trước khi giao dịch bst
đầu. Hệ cơ sở dữ liệu phải có trách nhiệm phát hiện sự cố hệ thống và trả lại cơ sở
dữ liệu về trạng thái trước khi xảy ra sự cố.
Khi một số giao dịch cạnh tranh cập nhật cơ sở dữ liệu, tính nhất quán của
dữ liệu có thể không được bảo tồn, ngay cả khi mỗi giao dịch là chính xác. Bộ
điều khiển cạnh tranh có trách nhiệm điều khiển các trao đổi giữa các giao dịch cạnh
tranh để đảm bảo tính thống nhất của CSDL.
Thường một hệ cơ sở dữ liệu cho phép nhiều giao dịch thực hiện đồng thời.
e. Quản lý lưu trữ
13
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Các cơ sở dữ liệu thường đòi hfi một khối lượng lớn không gian lưu trữ. Các
cơ sở dữ liệu hợp nhất thường được đo trong thuật ngữ gigatytes hay với các cơ sở dữ
liệu lớn là terabytes. Do bộ nhớ chính của máy tính không thể lưu trữ nhiều thông tin
như vậy, các thông tin này được lưu trữ trên các thiết bị nhớ ngoài.
Bộ quản lý lưu trữ là một Môđun chương trình cung cấp giao diện giữa các dữ
liệu được lưu trữ trong cơ sở dữ liệu mức thấp và các chương trình ứng dụng hay các
truy vấn được đệ trình với hệ thống. Bộ quản lý lưu trữ có trách nhiệm tương tác với
bộ quản lý file. Dữ liệu thô được lưu trữ trên đĩa từ sử dụng hệ thống xử lý file thường
được cung cấp bởi một hệ điều hành nào đó. Bộ quản lý lưu trữ dịch các lệnh của
ngôn ngữ DML khác nhau thành các lệnh hệ thống xử lý file ở mức thấp nhất. Do
vậy, bộ quản lý lưu trữ có trách nhiệm lưu trữ, tìm kiếm và cập nhật dữ liệu trong cơ
sở dữ liệu này.
1.2.3. Kiến trúc của một hệ quản trị cơ sở dữ liệu
Hình 1.3 chỉ ra các thành phần chủ yếu của một hệ quản trị cơ sở dữ liệu. Tại
đáy của kiến trúc, chúng ta nhìn thấy một sự biểu dixn của thiết bị nhớ ngoài lưu trữ
các dữ liệu và siêu dữ liệu. Chú ý rằng thành phần này chứa không chỉ các dữ liệu
được lưu trữ trong cơ sở dữ liệu mà cả các siêu dữ liệu, tức là các thông tin về cấu
trúc của cơ sở dữ liệu.
Các thay đổi sơ đồ Các truy vấn Các thay đổi dữ liệu
Bộ xử lý câu hfi
Bộ quản trị giao
dịch
Bộ quản lý lưu trữ
Dữ liệu
Siêu dữ liệu
Hình 1.3. Các thành phần chính của một hệ quản trị cơ sở dữ liệu
14
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Ví dụ 1.9. Nếu một hệ quản trị cơ sở dữ liệu là hệ quản trị cơ sở dữ liệu quan hệ, các
siêu dữ liêu bao gồm tên các quan hệ, tên các thuộc tính của các quan hệ và các kiểu
dữ liệu đối với các thuộc tính này.
Trong hình 1.3, chúng ta thấy một bộ quản lý lưu trữ mà nhiệm vụ của nó là
lấy ra các thông tin được yêu cầu từ những thiết bị lưu trữ dữ liệu và thay đổi những
thông tin này khi được yêu cầu bởi các mức trên nó của hệ thống. Bộ xử lý câu hfi
điều khiển không chỉ các câu hfi mà cả các yêu cầu thay đổi dữ liệu hay siêu dữ liệu.
Nhiệm vụ của nó là tìm ra một cách tốt nhất một thao tác được yêu cầu và phát ra các
lệnh đối với bộ phận quản lý lưu trữ để thực thi thao tác đó.
Thành phần bộ quản trị giao dịch có trách nhiệm đảm bảo tính toàn vkn của hệ
thống này. Nó phải đảm bảo rằng một số thao tác thực hiện đồng thời không cản trở
mỗi thao tác khác và hệ thống sẽ không mất dữ liệu thậm chí khi lỗi hệ thống xảy ra.
Nó tương tác với bộ xử lý câu hfi, do vậy nó phải biết dữ liệu nào được thao tác bởi
các thao tác hiện thời để tránh sự đụng độ các hành động và nó có thể cần thiết làm trx
một số truy vấn nhất định hay một số thao tác để các đụng độ này không xảy ra. Nó
tương tác với bộ phận quản lý lưu trữ bởi vì các sơ đồ đối với việc bảo vệ dữ liệu
thường kéo theo việc lưu trữ một nhật ký các thay đổi đối với dữ liệu. Bởi việc ssp
thứ tự các thao tác một cách thực sự, nhật ký sẽ chứa một bản ghi đối với mỗi thay đổi
để sau khi gặp lỗi hệ thống, các thay đổi chưa được ghi vào đĩa có thể được thực hiện
lại.
Tại đỉnh kiến trúc, chúng ta nhìn thấy ba kiểu thao tác đối với hệ quản trị cơ sở
dữ liệu này.
Các truy vấn: Đây là các thao tác hfi đáp về dữ liệu được lưu trữ trong cơ sở
dữ liệu. Chúng được sinh ra theo hai cách khác nhau:
Thông qua một giao diện truy vấn chung. Ví dụ, một hệ quản trị cơ sở dữ
liệu quan hệ cho phép người sử dụng đánh các truy vấn SQL mà nó được chuyển qua
bộ xử lý câu hfi và được trả lời.
Thông qua các giao diện chương trình ứng dụng. Một hệ quản trị cơ sở dữ
liệu điển hình cho phép những người lập trình viết các chương trình ứng dụng gọi đến
hệ quản trị cơ sở dữ liệu này và truy vấn cơ sở dữ liệu. Các truy vấn được đệ trình
thông qua một giao diện đặc biệt có thể chứ các hộp đối thoại. Một người sử dụng
không thể hfi các câu hfi tùy ý thông qua giao diện này, nhưng nói chung sẽ dx dàng
15
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
hơn đối với người sử dụng khi hfi một câu hfi thích hợp thông qua giao diện này so
với việc phải viết một truy vấn trực tiếp bởi SQL.
Các cập nhật dữ liệu. Đây là các thao tác thay đổi dữ liệu, ví dụ thêm, xóa, sửa
đổi dữ liệu trong cơ sở dữ liệu. Giống như các truy vấn, chúng có thể được phát ra
hoặc thông qua một giao diện chung hoặc thông qua giao diện của một chương trình
ứng dụng.
Các thay đổi sơ đồ. Các lệnh này thường được phát ra bởi một người sử dụng
được cấp phép, thường là những người quản trị cơ sở dữ liệu mới được phép thay đổi
sơ đồ của cơ sở dữ liệu hay tạo lập một cơ sở dữ liệu mới.
1.2.4. Người quản trị cơ sở dữ liệu
Một trong những lý do chính đối với việc sử dụng các hệ quản trị cơ sở dữ liệu
là có một sự điều khiển tập trung cả dữ liệu và các chương trình truy nhập dữ liệu này.
Một con người có trách nhiệm điều khiển một cách tập trung toàn bộ hệ thống được
gọi là người quản trị cơ sở dữ liệu. Các nhiệm vụ của người quản trị cơ sở dữ liệu này
bao gồm:
Định nghĩa sơ đồ
Người quản trị cơ sở dữ liệu tạo lập các sơ đồ cơ sở dữ liệu gốc bằng cách viết
một tập các định nghĩa môt tả các cấu trúc dữ liệu mà chúng được dịch bởi bộ dịc
DDL thành một tập các bảng được lưu trữ một cách lâu dài trong từ điển dữ liệu.
Xác định cấu trúc lưu trữ và phương pháp truy nhập
Người quản trị cơ sở dữ liệu tạo lập các cấu trúc lưu trữ và phương pháp truy
nhập thích hợp bằng cách viết một tập các định nghĩa mà chúng được dịch bởi bộ dịch
ngôn ngữ định nghĩa dữ liệu và lưu trữ dữ liệu.
Tuyên bố ủy quyền và truy nhập dữ liệu
Việc tuyên bố các kiểu ủy quyền khác nhau cho phép người quản trị cơ sở dữ
liệu qui định những bộ phận nào của cơ sở dữ liệu những người sử dụng khác nhau có
thể truy nhập. Những thông tin ủy quyền này được cất giữ trong một cấu trúc hệ thống
đặc biệt mà có thể được tra cứu bởi hệ cơ sở dữ liệu bất cứ khi nào một truy nhập dữ
liệu định đi vào hệ thống.
Đặc tả các ràng buộc toàn vẹn
Các giá trị dữ liệu được lưu trữ trong cơ sở dữ liệu thường phải thfa mãn
những ràng buộc toàn vkn nhất định. Ví dụ, chẳng hạn số giờ làm việc của một nhân
16
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
viên trong một tuần không được vượt quá 80giờ. Một ràng buộc như vậy phải được
đặc tả một cách tường minh bởi người quản trị cơ sở dữ liệu. Các ràng buộc toàn vkn
này được cất giữ trong một cấu trúc hệ thống đặc biệt mà có thể được tra cứu bởi hệ
cơ sở dữ liệu bất cứ khi nào một cập nhật dữ liệu xảy ra trong hệ thống.
1.2.5. Người sử dụng cơ sở dữ liệu
Mục đích chính của một hệ cơ sở dữ liệu là cung cấp một môi trường đối với
tìm kiếm thông tin từ cơ sở dữ liệu và lưu trữ những thông tin mới vào cơ sở dữ liệu.
Có ba nhóm người sử dụng khác nhau được phân biệt bởi cách họ mong muốn tương
tác với hệ thống.
Người lập trình ứng dụng
Đây là những người chuyên nghiệp về máy tính tương tác với hệ thống thông
qua các lời gọi DML mà được nhúng trong một chương trình được viết bởi ngôn ngữ
chủ. Các chương trình này được gọi chugn là các chương trình ứng dụng.
Do cú pháp của DML thường được biểu thị khác với cú pháp của ngôn ngữ
chủ, các lời gọi DML thường được bst đầu bằng một ký hiệu đặc biệt sao cho đoạn
mã tương ứng có thể được sản sinh. Một bộ tiền xử lý đặc biệt gọi là bộ tiền dịch
DML, biến đổi các chỉ thị DML thành các lời gọi thủ tục chu n trong ngôn ngữ chủ.
Chương trình kết quả sau đó được chạy thông qua chương trình dịch ngôn ngữ chủ mà
nó sinh ra đoạn mã đích tương ứng.
Người phân tích dữ liệu
Đây là những người sử dụng tương tác với hệ thống không thông qua các chương
trình ứng dụng. Thực chất họ phát biểu các yêu cầu của họ bởi một ngôn ngữ truy vấn
dữ liệu. Mỗi truy vấn như vậy được đệ trình đối với bộ xử lý câu hfi mà nhiệm vụ của
nó là phân tách chỉ thị DML thành các lệnh mà bộ quản lý lưu trữ có thể hiểu được.
Các nhà phân tích đệ trình các truy vấn để khai thác dữ liệu được xếp vào nhóm người
sử dụng này.
Người sử dụng đầu cuối
Đây là những người sử dụng bình thường tương tác với hệ thống bởi việc thực
hiện một trong các chương trình ứng dụng có sgn được viết từ trước.
1.3. Sự phân loại các hệ cơ sở dữ liệu
Trong thực tế, tuỳ theo qui mô để người sử dụng có thể phát triển một hệ cơ sở
dữ liệu nhf hoặc lớn.
17
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Có hai loại kiến trúc hệ cơ sở dữ liệu: tập trung và phân tán.
1.3.1. Các hệ cơ sở dữ liệu tập trung
Với một hệ cơ sở dữ liệu tập trung, tập tất cả các dữ liệu được định vị tại một
trạm đơn lẻ. Những người sử dụng tại các trạm từ xa nói chung có thể truy nhập cơ sở
dữ liệu thông qua các công cụ truyền thông dữ liệu.
a. Hệ cơ sở dữ liệu cá nhân
Các hệ cơ sở dữ liệu cá nhân thường một người sử dụng đơn lẻ mà họ vừa thiết
kế và tạo lập cơ sở dữ liệu, vừa cập nhật cơ sở dữ liệu và bảo trì cơ sở dữ liệu. Nói
cách khác, họ là vừa người quản trị cơ sở dữ liệu đồng thời là người viết chương
trình, đồng thời cũng là người sử dụng cuối của hệ.
Cơ sở dữ liệu
Hình 1.4. Hệ cơ sở dữ liệu cá nhân
b. Hệ cơ sở dữ liệu sở dữ liệu trung tâm
Cơ sở dữ liệu
Hình 1.5. Hệ cơ sở dữ liệu trung tâm
18
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Trong các tổ chức lớn, dữ liệu mà hầu hết các ứng dụng có thể truy nhập được lưu trữ
trên một máy tính trung tâm. Trong nhiều hệ thống, những người sử dụng từ xa có thể
truy nhập cơ sở dữ liệu này thông qua các thiết bị đầu cuối và các móc nối truyền dữ
liệu. Tuỳ thuộc vào qui mô tổ chức, máy tính trung tâm này thường là một dàn hay
một máy vi tính. Các hệ cơ sở dữ liệu trung tâm thường lưu trữ các cơ sở dữ liệu tích
hợp rất lớn và được nhiều người sử dụng truy nhập. Các ứng dụng điển hình như hệ
thống bán vé máy bay, hệ thống tàu hoả...
c. Hệ cơ sở dữ liệu khách/chủ
Một kiến trúc khách/chủ được thiết kế với sự phân tải công việc trên một mạng
máy tính trong đó các máy khách có thể chia sẽ các dịch vụ của một máy chủ đơn lẻ.
Một máy chủ là một ứng dụng phần mềm cung cấp các dịch vụ quản lý file hay cơ sở
dữ liệu, quản lý truyền thông....đối với các máy khách đang yêu cầu. Một máy khách
là một ứng dụng phần mềm yêu cầu các dịch vụ từ một hay nhiều máy chủ. Thông
thường, ứng dụng máy chủ (máy chủ cơ sở dữ liệu ) được định vị trên một máy tính
riêng trong mạng cục bộ.
Mục đích chính của một kiến trúc khách/chủ là cho phép các ứng dụng máy
khách truy nhập dữ liệu được quản lý bởi máy chủ. Giao diện người sử dụng và logic
của ứng dụng kinh doanh được xử lý trên máy khách, trong khi sử lý cơ sở dữ liệu
được thực hiện trên máy chủ cơ sở dữ liệu.
Cơ sở dữ liệu
Mạng cục bộ
Hình 1.6. Hệ cơ sở dữ liệu khách/chủ
19
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
1.3.2. Các hệ cơ sở dữ liệu phân tán
Ngày nay, nhiều tổ chức phân bố trên nhiều vị trí địa lý khác nhau như các
thành phố khác nhau hay các quốc gia khác nhau. Trong những trường hợp như vậy,
việc xây dựng các hệ cơ sở dữ liệu tập trung đối với các tổ chức này thường là không
thực tế và không kinh tế.
Một cơ sở dữ liệu phân tán là một cơ sở dữ liệu logic đơn lẻ mà được trải ra về
mặt vật lý trên nhiều máy tính ở nhiều vị trí địa lý khác nhau. Có hai kiểu chung nhất
của các hệ cơ sở dữ liệu phân tán là: hệ cơ sở dữ liệu phân tán thuần nhất và hệ cơ sở
dữ liệu phân tán không thuần nhất.
Hình 1.7. Các hệ cơ sở dữ liệu phân tán
20
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
a. Hệ cơ sở dữ liệu phân tán thuần nhất
Khi áp dụng đối với các hệ cơ sở dữ liệu, thuật ngữ thuần nhất có nghĩa là công
nghệ cơ sở dữ liệu là như nhau (hay ít nhất có thể tương thích) tại mỗi vị trí địa lý
khác nhau cũng có thể tương thích.
Trong hình trên, cơ sở dữ liệu của hệ được phân tán trên ba nút (hay ba vị trí
địa lý). Đối với các hệ cơ sở dữ liệu phân tán thuần nhất này, các điều kiện sau đây có
thể tồn tại:
Các hệ điều hành máy tính tại mỗi vị trí địa lý là như nhau hay ít nhất chúng
có khả năng tương thích cao.
Các mô hình dữ liệu được sử dụng tại mỗi vị trí địa lý là như nhau.
Các hệ quản trị cơ sở dữ liệu được sử dụng tại mỗi vị trí địa lý là như nhau
hay ít nhất chúng có khả năng tương thích cao.
Dữ liệu tại các vị trí khác nhau có các định nghĩa và khuôn dạng chung.
Các hệ cơ sở dữ liệu phân tán thuần nhất đơn giản hoá việc chia sẻ dữ liệu giữa những
người sử dụng khác nhau.
b. Hệ cơ sở dữ liệu phân tán không thuần nhất
Trong hầu hết các tổ chức, các hệ cơ sở dữ liệu liên quan đến một chu kỳ dài
không được chỉ đạo và lập kế hoạch c n thận. Các máy tính khác nhau và các hệ điều
hành khác nhau có thể được sử dụng tại mỗi vị trí địa lý. Các mô hình dữ liệu khác
nhau và các hệ quản tri cơ sở dữ liệu khác nhau cũng có thể được lựa chọn sử dụng.
Ví dụ, một vị trí có thể sử dụng công nghệ cơ sở dữ liệu quan hệ mới nhất, trong khi
một vị trí khác có thể lưu trữ dữ liệu sử dụng các file truyền thống hay các cơ sở dữ
liệu mạng, phân cấp cũ hơn.
Phức tạp hơn nữa, dữ liệu trên các vị trí thường không tương thích. Các mâu
thuen điển hình bao gồm các khác biệt về cú pháp (sự biểu dixn khác nhau của các
khoản mục dữ liệu tại hai vị trí) và các khác biệt về ngữ nghĩa.
21
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Câu hỏi
1. Nêu và phân tích các điểm khác nhau chính giữa một hệ thống xử lý file và một hệ
quản trị CSDL là gì ?
2. Liệt kê các nhiệm vụ của nhà quản trị CSDL. Đối với mỗi nhiệm vụ, giải thích rõ
những vấn đề nảy sinh nếu nhiệm vụ đó không được hoàn thành.
3. Sử dụng một mảng hai chiều kích c n x m như một ví dụ để minh hoạ sự khác
nhau:
a. Giữa ba mức trừu tượng dữ liệu
b. Giữa sơ đồ và thể hiện
4. Trong các hệ thống client-server tiêu biểu, máy server thường mạnh hơn máy client
rất nhiều: Có bộ xử lý nhanh hơn thậm chí có thể có nhiều bộ xử lý, có bộ nhớ lớn
hơn, có dung lượng đĩa lớn hơn. Ta xét một kịch bản trong đó các máy client và các
máy server là mạnh như nhau. Xây dựng một hệ thống client-server theo kịch bản như
vậy có ưu nhược điểm gì ? Kịch bản nào phù hợp hơn với kiến trúc server dữ liệu ?
22
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Chương 2
CÁC MÔ HÌNH DỮ LIỆU
Quá trình thiết kế một cơ sở dữ liệu bắt đầu với một sự phân tích những thông
tin nào của thế giới thực cơ sở dữ liệu phải lưu trữ và các mối quan hệ giữa các thành
phần của những thông tin này. Thông thường cấu trúc cơ sở dữ liệu hay còn gọi là sơ
đồ cơ sở dữ liệu được đặc tả bởi một ngôn ngữ đặc biệt hay một tập các ký hiệu thích
hợp để biểu thị một thiết kế cơ sở dữ liệu. Mô hình dữ liệu là một hình thức toán học
với một tập các ký hiệu được mô tả dữ liệu và một tập các phép toán được sử dụng để
thao tác dữ liệu này. Có nhiều loại mô hình dữ liệu như: mô hình mối quan hệ thực
thể (Entity Relationship Model), mô hình quan hệ (Relational Model), mô hình mạng
(Network Model),…tuy nhiên không thể nói mô hình nào là tốt nhất cho các hệ thống
cơ sở dữ liệu mà tuỳ theo đặc thù của các loại dữ liệu, tuỳ theo yêu cầu của các phép
xử lý mà chúng ta có thể chọn mô hình cơ sở dữ liệu thích hợp.
2.1. Mô hình thực thể liên kết
Mô hình thực thể liên kết (Mô hình ER) dựa trên cơ sở nhận thức của thế giới
thực bao gồm tập các đối tượng cơ sở được gọi là các thực thể và một tập các liên kết
giữa các đối tượng này. Mô hình dữ liệu ER là một trong các mô hình dữ liệu ngữ
nghĩa. Khía cạnh ngữ nghĩa của mô hình ở chổ cố gắng biểu diễn các ngữ nghĩa của
dữ liệu trong thế giới thực.
2.1.1. Các khái niệm cơ sở
Có 3 ký hiệu cơ bản mà mô hình thực thể liên kết sử dụng: Các tập thực thể,
các tập liên kết và các thuộc tính.
a. Các tập thực thể.
Một thực thể là một đối tượng cụ thể hay trừu tượng trong thế giới thực mà nó
tồn tại và có thể phân biệt được với các đối tượng khác. Chẳng hạn như một sinh viên
trong một lớp học là một thực thể. Một nhóm các thực thể giống nhau tạo thành một
tập thực thể. Ví dụ như tập thực thể sinh viên.
b. Các thuộc tính và khoá
Các tập thực thể có các đặc tính được gọi là các thuộc tính. Mỗi thuộc tính có
một miền giá trị.
23
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Việc lựa chọn các thuộc tính thích đáng đối với các tập thực thể là một bước
quan trọng trong việc thiết kế sơ đồ cơ sở dữ liệu khái niệm.
Mỗi thuộc tính hay một tập các thuộc tính mà giá trị của nó xác định duy nhất
mỗi thực thể trong tập thực thể được gọi là khoá đối với tập thực thể này. Về nguyên
tắc, mỗi tập thực thể có một khoá do chúng ta giả định rằng mỗi thực thể là phân biệt
với các thực thể khác.
Ví dụ 2.1. Tập thực thể sinh viên trong một trường Đại học, khi đó có thể sử dụng
MASV (mã số sinh viên) là một khoá.
c. Các liên kết
Một liên kết là một sự kết hợp giữa một số thực thể. Chẳng hạn, có thể xác
định một liên kết mà nó kết hợp một sinh viên A với một lớp B. Liên kết này nói rằng
sinh viên A là một thành viên của lớp B. Một tập liên kết là một tập các liên kết cùng
kiểu.
Một cách hình thức, một liên kết giữa các tập thực thể là một danh sách có thứ
tự các tập thực thể, một tập thực thể có thể xuất hiện nhiều hơn một lần trong danh
sách.
Nếu có một liên kết R giữa các tập thực thể E1, E2, …Ek thì một thể hiện của R
là một tập các k-bộ. Chúng ta gọi một tập như vậy là tập các liên kết. Mỗi k-bộ (e1, e2,
..ek) trong tập liên kết R với ei là một thể hiện Ei là một thể hiện của R.
d. Các phân cấp “is-a”
Chúng ta nói A là-một B, nếu tập thực thể B thực sự là tổng quát hoá của tập
thực thể A, hay nói một cách khác A là một kiểu đặc biệt của B. Mục đích của các
liên kết “là-một” giữa các tập thực thể A và B là như vậy A có thể kế thừa các thuộc
tính của B, nhưng A cũng có thể bổ sung thêm một số thuộc tính riêng mà B không
có.
Ví dụ 2.2. Một trường Đại học có tập thực thể Sinh viên với các thuộc tính như Mã
sinh viên, Tên sinh viên, quê quán. Nếu chúng ta xét tập thực thể sinh viên Khoa CNT
trong tập thực thể Sinh viên trên thì những sinh viên này có thêm các thuộc tính Khả
năng lập trình, Thiết kế Web…… Như vậy ta nói Sinh viên CNTT “là-một” Sinh
viên.
2.1.2. Sơ đồ thực thể liên kết (sơ đồ ER)
Việc tóm tắt những thông tin cần lưu trữ trong một cơ sở dữ liệu đối với một
thiết kế sử dụng các sơ đồ ER là rất có ích. Trong sơ đồ ER, chúng ta sử dụng các ký
24
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
hiệu sau để biểu diễn các thành phần của sơ đồ:
- Các hình chữ nhật biểu diễn các tập thực thể.
- Các hình Oval biểu diễn các thuộc tính, chúng được nối đến với các tập thực
thể bởi các cạnh không định hướng. Có thể gạch chân đối với thuộc tính khoá của tập
thực thể.
- Các hình thoi biểu diễn các liên kết. Chúng được nối đến các tập thực thể bởi
các cạnh có thể định hướng hoặc không định hướng.
Ví dụ
Số ĐVHT
Mã SV
Sinh viên Điểm thi
Môn học
Ngàysinh Họ SV Mã MH Tên MH
Tên SV Lần Điểm
2.1.3. Chức năng của các liên kết
Để mô hình hoá thế giới thực một cách thích hợp, người ta cần phân loại các
liên kết phù hợp với thực tế có bao nhiêu thực thể từ một tập thực thể có thể kết hợp
với bao nhiêu thực thể của tập thực thể khác.
a. Liên kết một-một
Có nghĩa là với mỗi thực thể trong tập thực thể này có nhiều nhất mỗi thực thể
trong tập thực thể kia và ngược lại.
b. Liên kết một-nhiều
Trong liên kết một-nhiều, một thực thể trong tập thực thể E1 được kết hợp với
không hoặc nhiều thực thể trong tập thực thể E2, nhưng một thực thể trong tập thực
thể E2 liên kết với duy nhất với một thực thể trong tập thực thể E1. Liên kết này được
gọi là một-nhiều từ E1 đến E2.
Khái niệm liên kết một-nhiều có thể được tổng quát hoá thành các liên kết giữa
nhiều hơn hai tập thực thể.
c. Liên kết nhiều-nhiều
Trong liên kết nhiều-nhiều, một thực thể trong tập thực thể E1 được kết hợp với
không hoặc nhiều thực thể trong tập thực thể E2 và ngược lại một thực thể trong tập
thực thể E2 liên kết với không hoặc thực thể trong tập thực thể E1.
25
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Trong khi các liên kết nhiều-nhiều xuất hiện khá thường xuyên trong thực tế,
chúng ta phải xem xét các liên kết này được biểu thị như thế nào trong sơ đồ khái
niệm của cơ sở dữ liệu thực sự. Nhiều mô hình dữ liệu không cho phép biểu thị trực
tiếp các liên kết nhiều-nhiều, thay vào đó đòi hỏi chúng phải được biến đổi thành một
số liên kết một-nhiều bởi một số kỹ thuật nào đó.
d. Xác định kiểu liên kết trong các sơ đồ ER
Nếu R là liên kết một-một giữa tập thực thể A và tập thực thể B, chúng ta vẽ
các mũi tên từ R đến cả A và B.
A R B
Nếu R là liên kết nhiều-nhiều giữa tập thực thể A và tập thực thể B, chúng ta
vẽ các cạnh không định hướng từ R đến cả A và B.
A R B
Nếu R là liên kết một-nhiều giữa tập thực thể A và tập thực thể B, chúng ta vẽ
mũi tên từ R đến A và cạnh không định hướng từ R đến B.
A R B
2.2. Mô hình dữ liệu quan hệ
2.2.1. Các khái niệm cơ bản
a. Quan hệ
Định nghĩa 2.1. Cho D1, D2, ….,Dn là n miền giá trị, r là một quan hệ trên các miền
D1, D2,….,Dn nếu r là một tập con nào đó các n-bộ được sắp có dạng (d1, d2,….dn) sao
cho di ∈Di với i = 1..n.
Dễ dàng nhận thấy theo định nghĩa, một quan hệ r trên các miền D1, D2, ….,Dn
chính là một tập con của tích Đề-các n miền đó.
Rõ ràng, một quan hệ được biểu diễn dưới dạng một bảng, mỗi dòng biểu diễn
một bộ của quan hệ.
26
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Để dễ dàng tham chiếu đến các thành phần của các bộ mà không cần biết thứ
tự của thành phần trong các bộ được sắp, người ta thường đặt tên cho các thành phần.
Chúng ta gọi tên của một thành phần là một thuộc tính.
Định nghĩa 2.2. Cho U ={A1, A2,….An} là một tập hữu hạn các thuộc tính. Với mỗi
thuộc tính Ai có miền giá trị tương ứng là Dom(Ai). Khi đó, r là quan hệ xác định trên
tập thuộc tính U nếu: r ⊆ Dom(A1) × Dom(A2) × ……. ×Dom(An)
b. Khoá và siêu khoá
Định nghĩa 2.3. Cho r xác định trên tập thuộc tính U với U ={A1, A2,….An}. Một tập
con K ⊆ U được gọi là siêu khoá của quan hệ r nếu với bất kỳ hai bộ t1, t2 thuộc r, t1 ≠
t2, đều tồn tại một thuộc tính A thuộc K sao cho t1[A] ≠ t2[A].
Theo định nghĩa, nếu K là siêu khoá của một quan hệ thì không tồn tại hai bộ
thuộc quan hệ khác nhau mà có giá trị bằng nhau trên mọi thuộc tính của K. Do đó,
giá trị của K xác định duy nhất một bộ của quan hệ.
Định nghĩa 2.4. Cho r xác định trên tập thuộc tính U với U ={A1, A2,….An}. Một tập
con K ⊆ U được gọi là khoá của quan hệ r nếu K là siêu khoá của r và bất kỳ tập con
thật sự K’ của K không là siêu khoá.
Trong một quan hệ có thể có nhiều khoá, người ta chọn một khoá làm khoá
chính, các khoá khác được xem là khoá dự tuyển.
Định nghĩa 2.5. Một tập con K ⊆ U được gọi là khoá ngoài của quan hệ r xác định
trên tập thuộc tính U tham chiếu đến quan hệ r’ nếu K là khoá chính của quan hệ r’.
2.2.2. Biến đổi các sơ đồ ER sang mô hình quan hệ
a. Biến đổi các tập thực thể
Một tập thực thể E được biến đổi thành một quan hệ mà sơ đồ quan hệ của nó
bao gồm các thuộc tính của tập thực thể. Mỗi bộ của quan hệ biểu diễn một thực thể
trong thể hiện hiện thời của E.
Nếu E là một tập thực thể mà các thực thể của nó xác định thông qua một liên
kết với một tập thực thể F nào đó thì sơ đồ quan hệ tương ứng với E chỉ chứa các
thuộc tính trong khoá của F.
b. Biến đổi các liên kết
Một liên kết R giữa các tập thực thể E1, E2, ….Ek được biến đổi thành một
quan hệ mà sơ đồ quan hệ của nó bao gồm các thuộc tính trong khoá của mỗi E1, E2,
….Ek.
c. Các khoá của các sơ đồ quan hệ
27
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Nếu một sơ đồ quan hệ được biến đổi từ một tập thực thể, khoá của tập thực
thể chính là khoá của sơ đồ quan hệ.
Nếu một sơ đồ quan hệ được biến đổi từ một liên kết nhiều-nhiều thì khoá của
sơ đồ quan hệ thường là tập tất cả các thuộc tính.
Nếu một sơ đồ quan hệ được biến đổi từ một liên kết một-một giữa hai tập thực
thể E và F thì khoá của E và khoá của F cả hai đều là khoá của sơ đồ quan hệ biểu
diễn liên kết này.
Nếu một sơ đồ quan hệ được biến đổi từ một liên kết một-nhiều từ Ek vào Ek-1,
….E1 thì tập các thuộc tính là hợp của các khoá của Ek-1, ….E1 thường là khoá của sơ
đồ quan hệ này.
d. Các sơ đồ quan hệ với khoá chung
Khi hai sơ đồ quan hệ có khoá chung chúng ta có thể tổ hợp các thuộc tính của
hai sơ đồ quan hệ và thay thế hai sơ đồ quan hệ này bởi một sơ đồ quan hệ mới với
tập thuộc tính là hợp của hai tập thuộc tính của hai sơ đồ quan hệ ban đầu.
2.3. Mô hình dữ liệu mạng
Mô hình dữ liệu mạng là một mô hình sơ đồ thực thể liên kết với tất cả các liên
kết được hạn chế là liên kết một-nhiều. Hạn chế này cho phép chúng ta sử dụng đồ thị
có hướng đơn giản để biểu diễn dữ liệu trong mô hình này. Trong mô hình mạng, các
tập thực thể được chuyển thành các kiểu bản ghi logic. Các kiểu bản ghi logic bao
gồm một tập các trường, mỗi trường chứa giá trị là một số nguyên hay một xâu ký
tự…Tập tên các trường và các kiểu của chúng cấu thành qui cách bản ghi logic.
2.3.1. Định danh bản ghi
Có thể có một sự tương tự gần gũi giữa các thuật ngữ của mô hình mạng và các
thuật ngữ trong mô hình quan hệ như sau:
Qui cách bản ghi logic Sơ đồ quan hệ
Bản ghi logic Bộ
Kiểu bản ghi Tên quan hệ
Tuy nhiên, có một sự khác biệt quan trọng giữa các bộ của quan hệ và các bản ghi của
kiểu bản ghi. Trong mô hình quan hệ hướng giá trị, các bộ chính là các giá trị đối với
các thành phần của bộ. Hai bộ có cùng giá trị trên các thuộc tính được xem là như
nhau. Mặt khác, mô hình mạng là mô hình hướng đối tượng. Các bản ghi của mô hình
mạng có thể được quan sát như có một khoá ẩn mà thực chất là địa chỉ bản ghi hay
28
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
định danh của đối tượng được biểu diễn bởi bản ghi. Định danh đối tượng duy nhất
này phục vụ cho việc phân biệt các bản ghi.
2.3.2. Các móc nối
Trong mô hình mạng, các liên kết hai ngôi một-nhiều được gọi là các móc nối.
Chúng ta vẽ một đồ thị có hướng được gọi là một mạng mà thực chất là một sơ đồ
thực thể liên kết đơn giản hoá để biểu diễn các kiểu bản ghi và các móc nối của
chúng. Các nút tương ứng với các kiểu bản ghi, nếu có một móc nối giữa hai kiểu bản
ghi T1 đến T2 và móc nối này là một-nhiều từ T1 đến T2 thì chúng ta vẽ một cung từ
nút T2 đến T1 và nói rằng móc nối này từ T2 đến T1. Các nút và các cung được gán
nhãn bởi tên của các kiểu bản ghi và tên của móc nối.
2.4. Mô hình dữ liệu phân cấp
Một mô hình phân cấp đơn giản là một mô hình mạng mà là một rừng (tập các
cây) trong đó tất cả các móc nối trỏ theo hướng từ con đến cha.
2.4.1. Thuật toán biến đổi mô hình mạng đơn giản
Chúng ta bắt đầu tại một nút có nhiều móc nối đi vào và không có móc nối đi
ra và đặt nó là gốc của cây. Chúng ta gắn vào cây mọi nút có thể gắn. Khi chúng ta
không thể thêm một nút nào khác vào cây đó, ta sẽ bắt đầu với một cây khác, một nút
cha chưa được gắn sẽ được chọn làm nút gốc và gắn mọi nút vào cây mà chúng ta có
thể. Thực tế, mỗi nút có thể xuất hiện trong rừng này một hay nhiều lần trên các cây
khác nhau. Đến đây chúng ta đã có một mô hình phân cấp.
2.4.2. Sự lặp lại các kiểu bản ghi
Chúng ta có thể thấy việc biến đổi mô hình mạng đôi khi có những bản ghi có
thể xuất hiện nhiều hơn một lần. Sự lặp lại này gây ra một số vấn đề như sau:
Chúng ta lãng phí không gian bộ nhớ vì chúng ta phải lưu trữ lặp lại dữ liệu
trong các bản ghi này một số lần.
Tính không nhất quán tiềm tàng có thể xuất hiện nếu chúng ta thay đổi giá trị
trong một bản sao nào đó của một bản ghi nhưng lại quên không thay đổi giá trị của
bản sao khác.
Việc khắc phục phục và tránh những vấn đề nảy sinh ở trên mà nguyên nhân
chính là sự lưu trữ lặp lại một số dữ liệu trong cơ sở dữ liệu là một mục tiêu quan
trọng của vấn đề thiết kế cơ sở dữ liệu.
29
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
2.5. Mô hình dữ liệu hướng đối tượng
Hiện nay, có một số lớn các đề nghị và một số cài đặt của các mô hình dữ liệu
có khả năng nắm bắt bản chất của các ngôn ngữ truy vấn hướng đối tượng. Các mô
hình này được lấy các tên gọi khác nhau như mô hình dữ liệu ngữ nghĩa, mô hình dữ
liệu chức năng. Đặc điểm chung của các mô hình này là chúng hỗ trợ:
Định danh đối tượng. Mỗi thực thể trong thế giới thực được mô hình hoá vào
trong cơ sở dữ liệu được gọi là một đối tượng. Mỗi một đối tượng được xác định duy
nhất bởi định danh đối tượng. Định danh đối tượng do hệ thống sinh ra và được quản
lý bởi hệ thống.
Các đối tượng phức tạp. Một cách điển hình, các mô hình này cho phép cấu
trúc các kiểu dữ liệu mới từ các kiểu dữ liệu đã có bởi cấu trúc bộ và cấu trúc tập.
Sự phân cấp kiểu. Chúng cho phép có các kiểu con với các tính chất đặc biệt
riêng của nó.
Tiếp theo chúng ta sẽ đi tìm hiểu một số khái niệm cơ bản trong mô hình dữ liệu
hướng đối tượng.
2.5.1. Cấu trúc đối tượng
Tập các cấu trúc đối tượng có thể định nghĩa trong mô hình của chúng ta là rất
gần với tập các sơ đồ có thể của các cơ sở dữ liệu trong mô hình phân cấp. Chúng ta
có thể định nghĩa một tập các kiểu đối tượng cho phép cùng với sự cài đặt vật lý dự
định của chúng một cách đệ qui như sau:
Kiểu dữ liệu nguyên tố, có nghĩa là số nguyên, số thực hay chuỗi ký tự có độ
dài cố định hay độ dài thay đổi, là một kiểu đối tượng.
Nếu T là một kiểu đối tượng thì SETOF(T) cũng là một kiểu đối tượng. Một
đối tượng có kiểu là SETOF(T) là một tập hợp các đối tượng có kiểu T. Do vậy,
SETOF(T) còn được gọi là kiểu tập.
Nếu T1, T2…., Tk là các kiểu đối tượng thì TUPLEOF(T1, T2, ..Tk) là một kiểu
đối tượng. Một kiểu đối tượng này là một k-bộ, trong đó thành phần thứ i của k-bộ có
kiểu Ti. Do vậy, TUPLEOF(T1, T2, ..Tk) còn được gọi là kiểu bộ.
2.5.2. Các lớp và các phương thức
Một mô hình dữ liệu hướng đối tượng không bị hạn chế đối với ký hiệu của
kiểu đối tượng. Ký hiệu cơ sở thực sự là lớp mà nó là một kiểu đối tượng và một tập
30
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
các phương thức hay các thao tác được thực hiện trên các đối tượng với cấu trúc đối
tượng của lớp này.
2.5.3. Sự phân cấp lớp
Một thành phần chủ yếu khác trong mô hình dữ liệu hướng đối tượng là ký
hiệu của các lớp con và sự phân cấp giữa các lớp, một sự hình thức hoá của các liê kết
“là-một”.
Giả sử chúng ta có một lớp C và chúng ta muốn định nghĩa một lớp con D.
Chúng ta bắt đầu với cùng cấu trúc đối tượng với lớp con D như đối với lớp C và với
cùng tập các phương thức đối với lớp con D như đối với lớp C. Sau đó chúng ta có thể
thay đổi lớp C như sau:
Nếu cấu trúc đối với lớp C là một kiểu bộ có dạng: TUPLEOF(T1, T2, ..Tk) thì
chúng ta có thể thêm một số thuộc tính đối với cấu trúc bộ này đặc trưng riêng cho
các đối tượng thuộc lớp con D.
Chúng ta có thể tạo các phương thức mới mà chỉ áp dụng đối với lớp con D.
Chúng ta có thể định nghĩa lại các phương thức của lớp C để nó có một ý nghĩa
mới đối với lớp con D.
31
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Chương 3
LƯU TRỮ VÀ CẤU TRÚC TẬP TIN
3.1. Khái quát về phương tiện lưu trữ vật lý
Có một số kiểu lưu trữ dữ liệu trong các hệ thống máy tính. Các phương tiện
lưu trữ được phân lớp theo tốc độ truy xuất, theo giá cả và theo độ tin cậy của phương
tiện. Các phương tiện hiện có là:
Cache: là dạng lưu trữ nhanh nhất và cũng đắt nhất trong các phương tiện lưu
trữ. Bộ nhớ cache nhỏ; sự sử dụng nó được quản trị bởi hệ điều hành
Bộ nhớ chính (main memory): Phương tiện lưu trữ dùng để lưu trữ dữ liệu sẵn
sàng được thực hiện. Các chỉ thị máy mục đích chung (general-purpose) hoạt động
trên bộ nhớ chính. Mặc dầu bộ nhớ chính có thể chứa nhiều megabytes dữ liệu, nó vẫn
là quá nhỏ (và quá đắt giá) để lưu trữ toàn bộ một cơ sở dữ liệu. Nội dung trong bộ
nhớ chính thường bị mất khi mất cấp nguồn
Bộ nhớ Flash: Được biết như bộ nhớ chỉ đọc có thể lập trình, có thể xoá
(EEPROM: Electrically Erasable Programmable Read-Only Memory), Bộ nhớ Flash
khác bộ nhớ chính ở chỗ dữ liệu còn tồn tại trong bộ nhớ flash khi mất cấp nguồn. Đọc
dữ liệu từ bộ nhớ flash mất ít hơn 100 ns , nhanh như đọc dữ liệu từ bộ nhớ chính. Tuy
nhiên, viết dữ liệu vào bộ nhớ flash phức tạp hơn nhiều. Dữ liệu được viết (một lần
mất khoảng 4 đến 10 s) nhưng không thể viết đè trực tiếp. Để viết đè bộ nhớ đã được
viết, ta phải xoá trắng toàn bộ bộ nhớ sau đó mới có thể viết lên nó.
Lưu trữ đĩa từ (magnetic-disk): (ở đây, được hiểu là đĩa cứng) Phương tiện
căn bản để lưu rữ dữ liệu trực tuyến, lâu dài. Thường toàn bộ cơ sở dữ liệu được lưu
trữ trên đĩa từ. Dữ liệu phải được chuyển từ đĩa vào bộ nhớ chính trước khi được truy
nhập. Khi dữ liệu trong bộ nhớ chính này bị sửa đổi, nó phải được viết lên đĩa. Lưu trữ
đĩa được xem là truy xuất trực tiềp vì có thể đọc dữ liệu trên đĩa theo một thứ tự bất
kỳ. Lưu trữ đĩa vẫn tồn tại khi mất cấp nguồn. Lưu trữ đĩa có thể bị hỏng hóc, tuy
không thường xuyên.
Lưu trữ quang (Optical storage): Dạng quen thuộc nhất của đĩa quang học là
loại đĩa CD-ROM : Compact-Disk Read-Only Memory. Dữ liệu được lưu trữ trên các
32
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
đĩa quang học được đọc bởi laser. Các đĩa quang học CD-ROM chỉ có thể dọc. Các
phiên bản khác của chúng là loại đĩa quang học: viết một lần, đọc nhiều lần (write-
once, read-many: WORM) cho phép viết dữ liệu lên đĩa một lần, không cho phép xoá
và viết lại, và các đĩa có thể viết lại (rewritable) v..v
Lưu trữ băng từ (tape storage): Lưu trữ băng từ thường dùng để backup dữ
liệu. Băng từ rẻ hơn đĩa, truy xuất dữ liệu chậm hơn (vì phải truy xuất tuần tự). Băng
từ thường có dung lượng rất lớn. Các phương tiện lưu trữ có thể được tổ chức phân cấp
theo tốc độ truy xuất và giá cả. Mức cao nhất là nhanh nhất nhưng cũng là đắt nhất,
giảm dần xuống các mức thấp hơn. Các phương tiện lưu trữ nhanh (cache, bộ nhớ
chính) được xem như là lưu trữ sơ cấp (primary storage), các thiết bị lưu trữ ở mức
thấp hơn như đĩa từ được xem như lưu trữ thứ cấp hay lưu trữ trực tuyến (on-line
storage), còn các thiết bị lưu trữ ở mức thấp nhất và gần thấp nhất như đĩa quang học,
băng từ kể cả các đĩa mềm được xếp vào lưu trữ tam cấp hay lưu trữ không trực tuyến
(off-line).
Bên cạnh vấn đề tốc độ và giá cả, ta còn phải xét đến tính lâu bền của các
phương tiện lưu trữ.
Hình 3.1. Phân cấp các thiết bị lưu trữ
33
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
3.2. Đĩa từ
3.2.1. Đặc trưng vật lý của đĩa
Mỗi tấm đĩa có dạng hình tròn, hai mặt của nó được phủ bởi vật liệu từ tính,
thông tin được ghi trên bề mặt đĩa. Đĩa gồm nhiều tấm đĩa. Ta sẽ sử dụng thuật ngữ
đĩa để chỉ các đĩa cứng. Khi đĩa được sử dụng, một động cơ ổ đĩa làm quay nó ở một
tốc độ không đổi. Một đầu đọc-viết được định vị trên bề mặt của tấm đĩa. Bề mặt tấm
đĩa được chia logic thành các rãnh, mỗi rãnh lại được chia thành các sector, một sector
là một đơn vị thông tin nhỏ có thể được đọc, viết lên đĩa. Tuỳ thuộc vào kiểu đĩa,
sector thay đổi từ 32 bytes đến 4095 bytes, thông thường là 512 bytes. Có từ 4 đến 32
sectors trên một rãnh, từ 20 đén 1500 rãnh trên một bề mặt. Mỗi bề mặt của một tấm
đĩa có một đầu đọc viết, nó có thể chạy dọc theo bán kính đĩa để truy cập đến các rãnh
khác nhau. Một đĩa gồm nhiều tấm đĩa, các đầu đọc-viết của tất cả các rãnh được gắn
vào một bộ được gọi là cánh tay đĩa, di chuyển cùng nhau. Các tấm đĩa được gắn vào
một trục quay. Vì các đầu đọc-viết trên các tấm đĩa di chuyển cùng nhau, nên khi đầu
đọc-viết trên một tấm đĩa đang ở rãnh thứ i thì các đầu đọc-viết của các tấm đĩa khác
cũng ở rãnh thứ i , do vậy các rãnh thứ i của tất cả các tấm đĩa được gọi là trụ
(cylinder) thứ i . Một bộ điều khiển đĩa giao diện giữa hệ thống máy tính và phần cứng
hiện thời của ổ đĩa. Nó chấp nhận các lệnh mức cao để đọc và viết một sector, và khởi
động các hành động như di chuyển cánh tay đĩa đến các rãnh đúng và đọc viết dữ liệu.
bộ điều khiển đĩa cũng tham gia vào checksum mỗi sector được viết. Checksum được
tính từ dữ liệu được viết lên sector. Khi sector được đọc lại, checksum được tính lại từ
dữ liệu được lấy ra và so sánh với checksum đã lưu trữ. Nếu dữ liệu bị sai lạc,
checksum được tính sẽ không khớp với checksum đã lưu trữ. Nếu lỗi như vậy xảy ra,
bộ điều khiển sẽ lặp lại việc đọc vài lần, nếu lỗi vẫn xảy ra, bộ điều khiển sẽ thông báo
việc đọc thất bại. Bộ điều khiển đĩa còn có chức năng tái ánh xạ các sector xấu: ánh xạ
các sector xấu đến một vị trí vật lý khác.
Hình 4.2. Các đĩa được nối với hệ thống máy tính
34
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Các đĩa được nối với một hệ thống máy tính hoặc một bộ điều khiển đĩa qua
một sự hợp nhất tốc độ cao. Hợp nhất hệ thống máy tính nhỏ (Small Computer-
System Interconnect: SCSI) thường được sử dụng để nối kết các đĩa với các máy tính
cá nhân và workstation. Mainframe và các hệ thống server thường có các bus nhanh
hơn và đắt hơn để nối với các đĩa.
Các đầu đọc-viết được giữ sát với bề mặt đĩa như có thể để tăng độ dày đặc
(density). Đĩa đầu cố định (Fixed-head) có một đầu riêng biệt cho mỗi rãnh, sự sắp xếp
này cho phép máy tính chuyển từ rãnh này sang rãnh khác mau chóng, không phải di
chuyển đầu đọc-viết. Tuy nhiên, cần một số rất lớn đầu đọc-viết, điều này làm nâng
giá của thiết bị.
3.2.2. Đo lường hiệu năng của đĩa
Các tiêu chuẩn đo lường chất luợng chính của đĩa là dung lượng, thời gian truy
xuất, tốc độ truyền dữ liệu và độ tin cậy.
Thời gian truy xuất (access time): là khoảng thời gian từ khi yêu cầu đọc/viết
được phát đi đến khi bắt đầu truyền dữ liệu. Để truy xuất dữ liệu trên một sector đã
cho của một đĩa, đầu tiên cánh tay đĩa phải di chuyển đến rãnh đúng, sau đó phải chờ
sector xuất hiện dưới nó, thời gian để định vị cánh tay được gọi là thời gian tìm kiếm
(seek time), nó tỷ lệ với khoảng cách mà cánh tay phải di chuyển, thời gian tìm kiếm
nằm trong khoảng 2..30 ms tuỳ thuộc vào rãnh xa hay gần vị trí cánh tay hiện tại.
Thời gian tìm kiếm trung bình (average seek time): Thời gian tìm kiếm trung
bình là trung bình của thời gian tìm kiếm, được đo luờng trên một dãy các yêu cầu
ngẫu nhiên (phân phối đều), và bằng khoảng 1/3 thời gian tìm kiếm trong trường hợp
xấu nhất.
Thời gian tiềm ẩn luân chuyển (rotational latency time): Thời gian chờ sector
được truy xuất xuất hiện dưới đầu đọc/viết. Tốc độ quay của đĩa nằm trong khoảng
60..120 vòng quay trên giây, trung bình cần nửa vòng quay để sector cần thiết nằm
dưới đầu đọc/viết. Như vậy, thời gian tiềm ẩn trung bình (average latency time) bằng
nửa thời gian quay một vòng đĩa. Thời gian truy xuất bằng tổng của thời gian tìm kiếm
và thời gian tiềm ẩn và nằm trong khoảng 10..40 ms.
Tốc độ truyền dữ liệu: là tốc độ dữ liệu có thể được lấy ra từ đĩa hoặc được
lưu trữ vào đĩa. Hiện nay tốc này vào khoảng 1..5 Mbps.
35
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Thời gian trung bình không sự cố (mean time to failure): lượng thời gian
trung bình hệ thống chạy liên tục không có bất kỳ sự cố nào. Các đĩa hiện nay có thời
gian không sự cố trung bình khoảng 30000 .. 800000 giờ nghĩa là khoảng từ 3,4 đến 91
năm.
3.2.3. Tối ưu hoá truy xuất khối đĩa
Yêu cầu I/O đĩa được sinh ra cả bởi hệ thống file lẫn bộ quản trị bộ nhớ ảo
trong hầu hết các hệ điều hành. Mỗi yêu cầu xác định địa chỉ trên đĩa được tham khảo,
địa chỉ này ở dạng số khối. Một khối là một dãy các sector kề nhau trên một rãnh. Kích
cỡ khối trong khoảng 512 bytes đến một vài Kbytes. Dữ liệu được truyền giữa đĩa và
bộ nhớ chính theo đơn vị khối. Mức thấp hơn của bộ quản trị hệ thống file sẽ chuyển
đổi địa chỉ khối sang số của trụ, của mặt và của sector ở mức phần cứng.
Truy xuất dữ liệu trên đĩa chậm hơn nhiều so với truy xuất dữ liệu trong bộ nhớ
chính, do vậy cần thiết một chiến lược nhằm nâng cao tốc độ truy xuất khối đĩa. Dưới
đây ta sẽ thảo luận một vài kỹ thuật nhằm vào mục đích đó.
Scheduling: Nếu một vài khối của một trụ cần được truyền từ đĩa vào bộ nhớ
chính, ta có thể tiết kiệm thời gian truy xuất bởi yêu cầu các khối theo thứ tự mà nó
chạy qua dưới đầu ọc/viết. Nếu các khối mong muốn ở trên các trụ khác nhau, ta yêu
cầu các khối theo thứ tự sao cho làm tối thiểu sự di chuyển cánh tay đĩa. Các thuật toán
scheduling cánh tay đĩa (Disk-arm-sheduling) nhằm lập thứ tự truy xuất các rãnh theo
cách làm tăng số truy xuất có thể được xử lý. Một thuật toán thường dùng là thuật toán
thang máy (elevator algorithm): Giả sử ban đầu cánh tay di chuyển từ rãnh trong nhất
hướng ra phía ngoài đĩa, đối với mỗi rãnh có yêu cầu truy xuất, nó dừng lại, phục vụ
yêu cầu đối với rãnh này, sau đó tiếp tục di chuyển ra phía ngoài đến tận khi không có
yêu cầu nào chờ các rãnh xa hơn phía ngoài. Tại điểm này, cánh tay đổi hướng, di
chuyển vào phía trong, lại dừng lại trên các rãnh được yêu cầu, và cứ như vậy đến tận
khi không còn rãnh nào ở trong hơn được yêu cầu, rồi lại đổi hướng v ..v. Bộ điều
khiển đĩa thường làm nhiệm vụ sắp xếp lại các yêu cầu đọc để cải tiến hiệu năng.
Tổ chức file: Để suy giảm thời gian truy xuất khối, ta có thể tổ chức các khối
trên đĩa theo cách tương ứng gần nhất với cách mà dữ liệu được truy xuất. Ví dụ, Nếu
ta muốn một file được truy xuất tuần tự, khi đó ta bố trí các khối của file một cách tuần
tự trên các trụ kề nhau. Tuy nhiên việc phân bố các khối lưu trữ kề nhau này sẽ bị phá
36
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
vỡ trong quá trình phát triển của file file không thể được phân bố trên các khối kề
nhau được nữa, hiện tượng này dược gọi là sự phân mảnh (fragmentation). Nhiều hệ
điều hành cung cấp tiện ích giúp suy giảm sự phân mảnh này (Defragmentation) nhằm
làm tăng hiệu năng truy xuất file.
Các buffers viết không hay thay đổi: Vì nội dung của bộ nhớ chính bị mất khi
mất nguồn, các thông tin về cơ sở dữ liệu cập nhật phải được ghi lên đĩa nhằm đề
phòng sự cố. Hiệu năng của các ứng dụng cập nhật cường độ cao phụ thuộc mạnh vào
tốc độ viết đĩa. Ta có thể sử dụng bộ nhớ truy xuất ngẫu nhiên không hay thay
đổi (nonvolatile RAM) để nâng tốc độ viết đĩa. Nội dung của nonvolatile RAM không
bị mất khi mất nguồn. Một phương pháp chung để thực hiện nonvolatile RAM là sử
dụng RAM pin dự phòng (battery-back-up RAM). Khi cơ sở dữ liệu yêu cầu viết một
khối lên đĩa, bộ điều khiển dĩa viết khối này lên buffer nonvolatile RAM, và thông báo
ngay cho hệ điều hành là việc viết đã thành công. Bộ điều khiển sẽ viết dữ liệu đến
đích của nó trên đĩa, mỗi khi đĩa rảnh hoặc buffer nonvolatile RAM đầy. Khi hệ cơ sở
dữ liệu yêu cầu một viết khối, nó chỉ chịu một khoảng lặng chờ đợi khi buffer
nonvolatile RAM đầy.
Đĩa log (log disk): Một cách tiếp cận khác để làm suy giảm tiềm năng viết là sử
dụng log-disk: Một đĩa được tận hiến cho việc viết một log tuần tự. Tất cả các truy
xuất đến log-disk là tuần tự, nhằm loại bỏ thời gian tìm kiếm, và một vài khối kề có
thể được viết một lần, tạo cho viết vào log-disk nhanh hơn viết ngẫu nhiên vài lần.
Cũng như trong trường hợp sử dụng nonvolatile RAM, dữ liệu phải được viết vào vị trí
hiện thời của chúng trên đĩa, nhưng việc viết này có thể được tiến hành mà hệ cơ sở dữ
liệu không cần thiết phải chờ nó hoàn tất. Log-disk có thể được sử dụng để khôi phục
dữ liệu. Hệ thống file dựa trên log là một phiên bản của cách tiếp cận log-disk: Dữ liệu
không được viết lại lên đích gốc của nó trên đĩa; thay vào đó, hệ thống file lưu vết nơi
các khối được viết mới đây nhất trên log-disk, và hoàn lại chúng từ vị trí này. Log-disk
được "cô đặc" lại (compacting) theo một định kỳ. Cách tiếp cận này cải tiến hiệu năng
viết, song sinh ra sự phân mảnh đối với các file được cập nhật thường xuyên.
3.2.4. RAID
Trong một hệ thống có nhiều đĩa, ta có thể cải tiến tốc độ đọc viết dữ liệu nếu
cho chúng hoạt động song song. Mặt khác, hệ thống nhiều đĩa còn giúp tăng độ tin cậy
lưu trữ bằng cách lưu trữ dư thừa thông tin trên các đĩa khác nhau, nếu một đĩa có sự
37
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
cố dữ liệu cũng không bị mất. Một sự đa dạng các kỹ thuật tổ chức đĩa, được gọi là
RAID (Redundant Arrays of Inexpensive Disks), được đề nghị nhằm vào vấn đề
tăng cường hiệu năng và độ tin cậy.
3.2.5. Cái tiến độ tin cậy thông qua sự dư thừa
Giải pháp cho vấn đề độ tin cậy là đưa vào sự dư thừa: lưu trữ thông tin phụ,
bình thường không cần thiết, nhưng nó có thể được sử dụng để tái tạo thông tin bị mất
khi gặp sự cố hỏng hóc đĩa, như vậy thời gian trung bình không sự cố tăng lên (xét
tổng thể trên hệ thống đĩa).
Đơn giản nhất, là làm bản sao cho mỗi đĩa. Kỹ thuật này được gọi là mirroring
hay shadowing. Một đĩa logic khi đó bao gồm hai đĩa vật lý, và mỗi việc viết được
thực hiện trên cả hai đĩa. Nếu một đĩa bị hư, dữ liệu có thể được đọc từ đĩa kia. Thời
gian trung bình không sự cố của đĩa mirror phụ thuộc vào thời gian trung bình không
sự cố của mỗi đĩa và phụ thuộc vào thời gian trung bình được sửa chữa (mean time to
repair): thời gian trung bình để một đĩa bị hư được thay thế và phục hồi dữ liệu trên nó.
3.2.6. Cải tiến hiệu năng thông qua song song
Với đĩa mirror, tốc độ đọc có thể tăng lên gấp đôi vì yêu cầu đọc có thể được
gửi đến cả hai đĩa. Với nhiều đĩa, ta có thể cải tiến tốc độ truyền bởi phân nhỏ (striping
data) dữ liệu qua nhiều đĩa. Dạng đơn giản nhất là tách các bít của một byte qua nhiều
đĩa, sự phân nhỏ này được gọi là sự phân nhỏ mức bit (bit-level striping). Ví dụ, ta có
một dàn 8 đĩa, ta viết bít thứ i của một byte lên đĩa thứ i . dàn 8 đĩa này có thể được xử
lý như một đĩa với các sector 8 lần lớn hơn kích cỡ thông thường, quan trọng hơn là
tốc dộ truy xuất tăng lên tám lần. Trong một tổ chức như vậy, mỗi đĩa tham gia vào
mỗi truy xuất (đọc/viết), như vậy, số các truy xuất có thể được xử lý trong một giây là
tương tự như trên một đĩa, nhưng mỗi truy xuất có thể đọc/viết nhiều dữ liệu hơn tám
lần. Phân nhỏ mức bit có thể được tổng quát cho số đĩa là bội hoặc ước của 8, Ví dụ, ta
có một dàn 4 đĩa, ta sẽ phân phối bít thứ i và bít thứ 4+i vào đĩa thứ i. Hơn nữa, sự
phân nhỏ không nhất thiết phải ở mức bit của một byte. Ví dụ, trong sự phân nhỏ mức
khối, các khối của một file được phân nhỏ qua nhiều đĩa, với n đĩa, khối thứ i có thể
được phân phối qua đĩa (i mod n) + 1. Ta cũng có thể phân nhỏ ở mức byte, sector
hoặc các sector của một khối. Hai đích song song trong một hệ thống đĩa là:
38
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Nạp nhiều truy xuất nhỏ cân bằng (truy xuất trang) sao cho lượng dữ liệu được
nạp trong một đơn vị thời gian của truy xuất như vậy tăng lên.
Song song hoá các truy xuất lớn sao cho thời gian trả lời các truy xuất lớn giảm.
3.2.7. Các mức RAID
Mirroring cung cấp độ tin cậy cao, nhưng đắt giá. Phân nhỏ cung cấp tốc độ
truyền dữ liệu cao, nhưng không cải tiến được độ tin cậy. Nhiều sơ đồ cung cấp sự dư
thừa với giá thấp bằng cách phối hợp ý tưởng của phân nhỏ với "parity" bit. Các sơ đồ
này có sự thoả hiệp giá-hiệu năng khác nhau và được phân lớp thành các mức được
gọi là các mức RAID.
Mức RAID 0 : Liên quan đến các dàn đĩa với sự phân nhỏ mức khối, nhưng
không có một sự dư thừa nào.
Mức RAID 1 : Liên quan đến mirror đĩa
Mức RAID 2 : Cũng được biết dưới cái tên mã sửa lỗi kiểu bộ nhớ (memory-
style error-correcting-code : ECC). Hệ thống bộ nhớ thực hiện phát hiện lỗi bằng bit
parity. Mỗi byte trong hệ thống bộ nhớ có thể có một bit parity kết hợp với nó. Sơ đồ
sửa lỗi lưu hai hoặc nhiều hơn các bit phụ, và có thể dựng lại dữ liệu nếu một bit bị lỗi.
ý tưởng của mã sửa lỗi có thể được sử dụng trực tiếp trong dàn đĩa thông qua phân nhỏ
byte qua các đĩa. Ví dụ, bít đầu tiên của mỗi byte có thể được lưu trên đĩa 1, bit thứ hai
trên đĩa 2, và cứ như vậy, bit thứ 8 trên đĩa 8, các bit sửa lỗi được lưu trên các đĩa thêm
vào. Nếu một trong các đĩa bị hư, các bít còn lại của byte và các bit sửa lỗi kết hợp
được đọc từ các đĩa khác có thể giúp tái tạo bít bị mất trên đĩa hư, như vậy ta có thể
dựng lại dữ liệu. Với một dàn 4 đĩa dữ liệu, RAID mức 2 chỉ cần thêm 3 đĩa để lưu các
bit sửa lỗi (các đĩa thêm vào này được gọi là các đĩa overhead), so sánh với RAID mức
1, cần 4 đĩa overhead.
Mức RAID 3 : Còn được gọi là tổ chức parity chen bit (bit-interleaved parity).
Bộ điều khiển đĩa có thể phát hiện một sector được đọc đúng hay sai, như vậy có thể
sử dụng chỉ một bit parity để sửa lỗi: Nếu một trong các sector bị hư, ta biết chính xác
đó là sector nào, Với mỗi bit trong sector này ta có thể hình dung nó là bít 1 hay bit 0
bằng cách tính parity của các bit tương ứng từ các sector trên các đĩa khác. Nếu parity
của các bit còn lại bằng với parity được lưu, bit mất sẽ là 0, ngoài ra bit mất là 1.
39
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
RAID mức 3 tốt như mức 2 nhưng it tốn kém hơn (chỉ cần một đĩa overhead).
Mức RAID 4 : Còn được gọi là tổ chức parity chen khối (Block-interleaved
parity), lưu trữ các khối đúng như trong các đĩa chính quy, không phân nhỏ chúng qua
các đĩa nhưng lấy một khối parity trên một đĩa riêng biệt đối với các khối tương ứng từ
N đĩa khác. Nếu một trong các đĩa bị hư, khối parity có thể được dùng với các khối
tương ứng từ các đĩa khác để khôi phục khối của đĩa bị hư.
Một đọc khối chỉ truy xuất một đĩa, cho phép các yêu cầu khác được xử lý bởi
các đĩa khác. Như vậy, tốc độ truyền dữ liệu đối với mỗi truy xuất chậm, nhưng nhiều
truy xuất đọc có thể được xử lý song song, dẫn đến một tốc độ I/O tổng thể cao hơn.
Tốc độ truyền đối vớí các đọc dữ liệu lớn (nhiều khối) cao do tất cả các đĩa có thể
được đọc song song; các viết dữ liệu lớn (nhiều khối) cũng có tốc độ truyền cao vì dữ
liệu và parity có thể được viết song song. Tuy nhiên, viết một khối đơn phải truy xuất
đĩa trên đó khối được lưu trữ, và đĩa parity (do khối parity cũng phải được cập nhật).
Như vậy, viết một khối đơn yêu cầu 4 truy xuất: hai để đọc hai khối cũ, và hai để viết
lại hai khối.
Mức RAID 5 : Còn gọi là parity phân bố chen khối (Block-interleaved
Distributed Parity), cải tiến của mức 4 bởi phân hoạch dữ liệu và parity giữa toàn bộ
N+1 đĩa, thay vì lưu trữ dữ liệu trên N đĩa và parity trên một đĩa riêng biệt như trong
RAID 4. Trong RAID 5, tất cả các đĩa có thể tham gia làm thoả mãn các yêu cầu đọc,
như vậy sẽ làm tăng tổng số yêu cầu có thể được đặt ra trong một đơn vị thời gian. Đối
với mỗi khối, một đĩa lưu trữ parity, các đĩa khác lưu trữ dữ liệu. Ví dụ, với một dàn
năm đĩa, parity đối với khối thứ n được lưu trên đĩa (n mod 5)+1. Các khối thứ n của 4
đĩa khác lưu trữ dữ liệu hiện hành của khối đó.
Mức RAID 6 : Còn được gọi là sơ đồ dư thừa P+Q (P+Q redundancy scheme),
nó rất giống RAID 5 nhưng lưu trữ thông tin dư thừa phụ để canh chừng nhiều đĩa bị
hư. Thay vì sử dụng parity, người ta sử dụng các mã sửa lỗi.
3.2.8. Chọn mức RAID đúng
Nếu đĩa bị hư, Thời gian tái tạo dữ liệu của nó là đáng kể và thay đổi theo mức
RAID được dùng. Sự tái tạo dễ dàng nhất đối với mức RAID 1. Đối với các mức khác,
ta phải truy xuất tất cả các đĩa khác trong dàn đĩa để tái tạo dữ liệu trên đĩa bị hư. Hiệu
năng tái tạo của một một hệ thống RAID có thể là một nhân tố quan trọng nếu việc
0
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
cung cấp dữ liệu liên tục được yêu cầu (thường xảy ra trong các hệ CSDL hiệu năng
cao hoặc trao đổi). Hơn nữa, hiệu năng tái tạo ảnh hưởng đến thời gian trung bình
không sự cố. Vì RAID mức 2 và 4 được gộp lại bởi RAID mức 3 và 5, Việc lựa chọn
mức RAID thu hẹp lại trên các mức RAID còn lại. Mức RAID 0 được dùng trong các
ứng dụng hiệu năng cao ở đó việc mất dữ liệu không có gì là trầm trọng cả. RAID mức
1 là thông dụng cho các ứng dụng lưu trữ các log-file trong hệ CSDL. Do mức 1 có
overhead cao, mức 3 và 5 thường được ưa thích hơn đối với việc lưu trữ khối lượng dữ
liệu lớn. Sự khác nhau giữa mức 3 và mức 5 là tốc độ truyền dữ liệu đối lại với tốc độ
I/O tổng thể. Mức 3 được ưa thích hơn nếu truyền dữ liệu cao được yêu cầu, mức 5
được ưa thích hơn nếu việc đọc ngẫu nhiên là quan trọng. Mức 6, tuy hiện nay ít được
áp dụng, nhưng nó có độ tin cậy cao hơn mức 5.
3.2.9. Mở rộng
Các quan niệm của RAID được khái quát hoá cho các thiết bị lưu trữ khác, bao
hàm các dàn băng, thậm chí đối với quảng bá dữ liệu trên các hệ thống không dây. Khi
áp dụng RAID cho dàn băng, cấu trúc RAID cho khả năng khôi phục dữ liệu cả khi
một trong các băng bị hư hại. Khi áp dụng đối với quảng bá dữ liệu, một khối dữ liệu
được phân thành các đơn vị nhỏ và được quảng bá cùng với một đơn vị parity; nếu một
trong các đơn vị này không nhận được, nó có thể được dựng lại từ các đơn vị còn lại.
3.3. Lưu trữ tam cấp
3.3.1. Đĩa quanng học
CR-ROM có ưu điểm là có khả năng lưu trữ lớn, dễ di chuyển (có thể đưa vào
và lấy ra khỏi ổ đĩa như đĩa mềm), hơn nữa giá lại rẻ. Tuy nhiên, so với ổ đĩa cứng,
thời gian tìm kiếm của ổ CD-ROM chậm hơn nhiều (khoảng 250ms), tốc độ quay
chậm hơn, từ đó dẫn đến độ trễ cao hơn; tốc độ truyền dữ liệu cũng chậm hơn (khoảng
150Kbytes/s). Gần đây, một định dạng mới của đĩa quang học - Digital video disk
(DVD) - được chuẩn hoá, các đĩa này có dung lượng trong khoảng 4,7GBytes đến 17
GBytes. Các đĩa WORM, REWRITABLE cũng trở thành phổ biến. Các WORM
jukeboxes là các thiết bị có thể lưu trữ một số lớn các đĩa WORM và có thể nạp tự
động các đĩa theo yêu cầu đến một hoặc một vài ổ WORM.
3.3.2. Băng từ
1
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Băng từ có thể lưu một lượng lớn dữ liệu, tuy nhiên, chậm hơn so với đĩa từ và
đĩa quang học. Truy xuất băng buộc phải là truy xuất tuần tự, như vậy nó không thích
hợp cho hầu hết các đòi hỏi của lưu trữ thứ cấp. Băng từ được sử dụng chính cho việc
backup, cho lưu trữ các thông tin không được sử dụng thường xuyên và như một
phương tiện ngoại vi (off-line medium) để truyền thông tin từ một hệ thống đến một hệ
thống khác. Thời gian để định vị đoạn băng lưu dữ liệu cần thiết có thể kéo dài đến
hàng phút. Jukeboxes băng chứa một lượng lớn băng, với một vài ổ băng và có thể lưu
trữ được nhiều TeraBytes (1012 Bytes)
3.4. Truy xuất lưu trữ
Một cơ sở dữ liệu được ánh xạ vào một số các file khác nhau được duy trì bởi
hệ điều hành nền. Các file này lưu trú thường trực trên các đĩa với backup trên băng.
Mỗi file được phân hoạch thành các đơn vị lưu trữ độ dài cố định được gọi là khối -
đơn vị cho cả cấp phát lưu trữ và truyền dữ liệu.
Một khối có thể chứa một vài hạng mục dữ liệu (data item). Ta giả thiết không
một hạng mục dữ liệu nào trải ra trên hai khối. Mục tiêu nổi trội của hệ CSDL là tối
thiểu hoá số khối truyền giữa đĩa và bộ nhớ. Một cách để giảm số truy xuất đĩa là giữ
nhiều khối như có thể trong bộ nhớ chính. Mục đích là để khi một khối được truy xuất,
nó đã nằm sẵn trong bộ nhớ chính và như vậy không cần một truy xuất đĩa nào cả.
Do không thể lưu tất cả các khối trong bộ nhớ chính, ta cần quản trị cấp phát
không gian sẵn có trong bộ nhớ chính để lưu trữ các khối. Bộ đệm (Buffer) là một
phần của bộ nhớ chính sãn có để lưu trữ bản sao khối đĩa. Luôn có một bản sao trên
đĩa cho mỗi khối, song các bản sao trên đĩa của các khối là các phiên bản cũ hơn so với
phiên bản trong buffer. Hệ thống con đảm trách cấp phát không gian buffer được gọi là
bộ quản trị buffer.
3.4.1. Bộ quản trị buffer
Các chương trình trong một hệ CSDL đưa ra các yêu cầu cho bộ quản trị buffer
khi chúng cần một khối đĩa. Nếu khối này đã sẵn sàng trong buffer, địa chỉ khối trong
bộ nhớ chính được chuyển cho người yêu cầu. Nếu khối chưa có trong buffer, bộ quản
trị buffer đầu tiên cấp phát không gian trong buffer cho khối, rút ra một số khối khác,
nếu cần thiết, để lấy không gian cho khối mới. Khối được rút ra chỉ được viết lại trên
đĩa khi nó có bị sửa đổi kể từ lần được viết lên đĩa gần nhất. Sau đó bộ quản trị buffer
2
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
đọc khối từ đĩa vào buffer, và chuyển địa chỉ của khối trong bộ nhớ chính cho người
yêu cầu. Bộ quản trị buffer không khác gì nhiều so với bộ quản trị bộ nhớ ảo, một
điểm khác biệt là kích cỡ của một CSDL có thể rất lớn không đủ chứa toàn bộ trong bộ
nhớ chính do vậy bộ quản trị buffer phải sử dụng các kỹ thuật tinh vi hơn các sơ đồ
quản trị bộ nhớ ảo kiểu mẫu.
Chiến luợc thay thế. Khi không có chỗ trong buffer, một khối phải được xoá
khỏi buffer trước khi một khối mới được đọc vào. Thông thường, hệ điều hành sử
dụng sơ đồ LRU (Least Recently Used) để viết lên đĩa khối ít được dùng gần đây nhất,
xoá bỏ nó khỏi buffer. Cách tiếp cận này có thể được cải tiến đối với ứng dụng CSDL.
Khối chốt (pinned blocks). Để hệ CSDL có thể khôi phục sau sự cố, cần thiết
phải hạn chế thời gian khi viết lại lên đĩa một khối. Một khối không cho phép viết lại
lên đĩa được gọi là khối chốt.
Xuất ra bắt buộc các khối (Forced output of blocks). Có những tình huống
trong đó cần phải viết lại một khối lên đĩa, cho dù không gian buffer mà nó chiếm là
không cần đến. Việc viết này được gọi là sự xuất ra bắt buộc của một khối. Lý do
ngắn gọn của yêu cầu xuất ra bắt buộc khối là nội dung của bộ nhớ chính bị mất khi có
sự cố, ngược lại dữ liệu trên dĩa còn tồn tại sau sự cố.
3.4.2. Các đối sách thay thế buffer
Mục đích của chiến lược thay thế khối trong buffer là tối thiểu hoá các truy xuất
đĩa. Các hệ điều hành thường sử dụng chiến lược LRU để thay thế khối. Tuy nhiên,
một hệ CSDL có thể dự đoán mẫu tham khảo tương lai. Yêu cầu của một người sử
dụng đối với hệ CSDL bao gồm một số bước. Hệ CSDL có thể xác định trước những
khối nào sẽ là cần thiết bằng cách xem xét mỗi một trong các bước được yêu cầu để
thực hiện hoạt động được yêu cầu bởi người sử dụng. Như vậy, khác với hệ điều hành,
hệ CSDL có thể có thông tin liên quan đến tương lai, chí ít là tương lai gần. Trong
nhiều trường hợp, chiến lược thay thế khối tối ưu cho hệ CSDL lại là MRU (Most
Recently Used): Khối bị thay thế sẽ là khối mới được dùng gần đây nhất! Bộ quản trị
buffer có thể sử dụng thông tin thống kê liên quan đến xác suất mà một yêu cầu sẽ
tham khảo một quan hệ riêng biệt nào đó. Tự điển dữ liệu là một trong những phần
được truy xuất thường xuyên nhất của CSDL. Như vậy, bộ quản trị buffer sẽ không
nên xoá các khối tự điển dữ liệu khỏi bộ nhớ chính trừ phi các nhân tố khác bức chế
3
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
làm điều đó. Một chỉ mục (Index) đối với một file được truy xuất thường xuyên hơn
chính bản thân file, vậy thì bộ quản trị buffer cũng không nên xoá khối chỉ mục khỏi
bộ nhớ chính nếu có sự lựa chọn.
Chiến luợc thay thế khối CSDL lý tưởng cần hiểu biết về các hoạt động CSDL
đang được thực hiện. Không một chiến lược đơn lẻ nào được biết nắm bắt được toàn
bộ các viễn cảnh có thể. Tuy vậy, một điều đáng ngạc nhiên là phần lớn các hệ CSDL
sử dụng LRU bất chấp các khuyết điểm của chiến lược đó.
Chiến lược được sử dụng bởi bộ quản trị buffer để thay thế khối bị ảnh hưởng
bởi các nhân tố khác hơn là nhân tố thời gian tại đó khối được tham khảo trở lại. Nếu
hệ thống đang xử lý các yêu cầu của một vài người sử dụng cạnh tranh, hệ thống (con)
điều khiển cạnh tranh (concurrency-control subsystem) có thể phải làm trễ một số yêu
cầu để đảm bảo tính nhất quán của CSDL. Nếu bộ quản trị buffer được cho các thông
tin từ hệ thống điều khiển cạnh tranh mà nó nêu rõ những yêu cầu nào đang bị làm trễ,
nó có thể sử dụng các thông tin này để thay đổi chiến lược thay thế khối của nó. Đặc
biệt, các khối cần thiết bởi các yêu cầu tích cực (active requests) có thể được giữ lại
trong buffer, toàn bộ các bất lợi đổ dồn lên các khối cần thiết bởi các yêu cầu bị làm
trễ.
Hệ thống (con) khôi phục (crash-recovery subsystem) áp đặt các ràng buộc
nghiêm nhặt lên việc thay thế khối. Nếu một khối bị sửa đổi, bộ quản trị buffer không
được phép viết lại phiên bản mới của khối trong buffer lên đĩa, vì điều này phá huỷ
phiên bản cũ. Thay vào đó, bộ quản trị khối phải tìm kiếm quyền từ hệ thống khôi
phục trước khi viết khối. Hệ thống khôi phục có thể đòi hỏi một số khối nhất định khác
là xuất bắt buộc (forced output) trước khi cấp quyền cho bộ quản trị buffer để xuất ra
khối được yêu cầu.
3.5. Tổ chức file
Một file được tổ chức logic như một dãy các mẩu tin (record). Các mẩu tin này
được ánh xạ lên các khối đĩa. File được cung cấp như một xây dựng cơ sở trong hệ
điều hành, như vậy ta sẽ giả thiết sự tồn tại của hệ thống file nền. Ta cần phải xét
những phương pháp biểu diễn các mô hình dữ liệu logic trong thuật ngữ file. Các khối
có kích cỡ cố định được xác định bởi tính chất vật lý của đĩa và bởi hệ điều hành, song
kích cỡ của mẩu tin lại thay đổi. Trong CSDL quan hệ, các bộ của các quan hệ khác
4
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
nhau nói chung có kích cỡ khác nhau. Một tiếp cận để ánh xạ một CSDL đến các file
là sử dụng một số file, và lưu trữ các mẩu tin thuộc chỉ một độ dài cố định vào một file
đã cho nào đó. Một cách khác là cấu trúc các file sao cho ta có thể điều tiết nhiều độ
dài cho các mẩu tin. Các file của các mẩu tin độ dài cố định dễ dàng thực thi hơn file
của các mẩu tin độ dài thay đổi.
3.5.1. Mẫu tin độ dài cố định
Xét một file các mẩu tin account đối với CSDL ngân hàng, mỗi mẩu tin của file
này được xác định như sau:
Type
depositor = record
branch_name:char(20);
account_number:char(10);
balance:real;
end
Giả sử mỗi một ký tự chiếm 1 byte và mỗi số thực chiếm 8 byte, như vậy mẩu
tin account có độ dài 40 bytes. Một cách tiếp cận đơn giản là sử dụng 40 byte đầu tiên
cho mẩu tin thứ nhất, 40 byte kế tiếp cho mẩu tin thứ hai, ... Cách tiếp cận đơn giản
này nảy sinh những vấn đề sau:
1. Khó khăn khi xoá một mẩu tin từ cấu trúc này. Không gian bị chiếm bởi mẩu
tin bị xoá phải được lấp đầy với mẩu tin khác của file hoặc ta phải đánh dấu mẩu tin bị
xoá.
2. Trừ khi kích cỡ khối là bội của 40, nếu không một số mẩu tin sẽ bắt chéo qua
biên khối, có nghĩa là một phần mẩu tin được lưu trong một khối, một phần khác được
lưu trong một khối khác. như vậy đòi hỏi phải truy xuất hai khối để đọc/viết một mẩu
tin "bắc cầu" đó. Khi một mẩu tin bị xoá, ta có thể di chuyển mẩu tin kề sau nó vào
không gian bị chiếm một cách hình thức bởi mẩu tin bị xoá, rồi mẩu tin kế tiếp vào
không gian bị chiếm của mẩu tin vừa được di chuyển, cứ như vậy cho đến khi mỗi
mẩu tin đi sau mẩu tin bị xoá được dịch chuyển hướng về đầu. Cách tiếp cận này đòi
hỏi phải di chuyển một số lớn các mẩu tin.
Ví dụ:
5
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Một cách tiếp cận khác đơn giản hơn là di chuyển mẩu tin cuối cùng vào không
gian bị chiếm bởi mẩu tin bị xoá. Song cách tiếp cận này đòi hỏi phải truy xuất khối bổ
sung.
Vì hoạt động chèn xảy ra thường xuyên hơn hoạt động xoá, ta có thể chấp nhận
việc để "ngỏ" không gian bị chiếm bởi mẩu tin bị xoá, và chờ một hoạt động chèn đến
sau để tái sử dụng không gian đó. Một dấu trên mẩu tin bị xoá là không đủ vì sẽ gây
khó khăn cho việc tìm kiếm không gian "tự do" đó khi chèn. Như vậy ta cần đưa vào
cấu trúc bổ xung. ở đầu của file, ta cấp phát một số byte nhất định làm header của file.
Header này sẽ chứa đựng thông tin về file. Header chứa địa chỉ của mẩu tin bị xoá thứ
nhất, trong nội dung của mẩu tin này có chứa địa chỉ của mẩu tin bị xoá thứ hai và cứ
như vậy. Như vậy, các mẩu tin bị xoá sẽ tạo ra một danh sách liên kết dược gọi là danh
sách tự do (free list).
6
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Khi chèn mẩu tin mới, ta sử dụng con trỏ đầu danh sách được chứa trong header
để xác định danh sách, nếu danh sách không rỗng ta chèn mẩu tin mới vào vùng được
trỏ bởi con trỏ đầu danh sách nếu không ta chèn mẩu tin mới vào cuối file.
Chèn và xoá đối với file mẩu tin độ dài cố định thực hiện đơn giản vì không
gian được giải phóng bởi mẩu tin bị xoá đúng bằng không gian cần thiết để chèn một
mẩu tin. Đối với file của các mẩu tin độ dài thay đổi vấn đề trở nên phức tạp hơn
nhiều.
3.5.2. Mẫu tin độ dài thay đổi
Mẩu tin độ dài thay đổi trong CSDL do bởi:
- Việc lưu trữ nhiều kiểu mẩu tin trong một file.
- Kiểu mẩu tin cho phép độ dài trường thay đổi.
- Kiểu mẩu tin cho phép lặp lại các trường.
Có nhiều kỹ thuật để thực hiện mẩu tin độ dài thay đổi. Để minh hoạ ta sẽ xét
các biểu diễn khác nhau trên các mẩu tin độ dài thay đổi có định dạng sau:
Type account_list = record
7
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
branch_name: char(20) ;
account_info : array[1..N] of record
account_number: char(10);
balance: real;
end;
end
Biểu diễn chuỗi byte (Byte-String Representation)
Một cách đơn giản để thực hiện các mẩu tin độ dài thay đổi là gắn một ký hiệu
đặc biệt End-of-record (⊥) vào cuối mỗi record. Khi đó, ta có thể lưu mỗi mẩu tin
như một chuỗi byte liên tiếp. Thay vì sử dụng một ký hiệu đặc biệt ở cuối của mỗi mẩu
tin, một phiên bản của biểu diễn chuỗi byte lưu trữ độ dài mẩu tin ở bắt đầu của mỗi
mẩu tin.
Hình 4.3. Biểu diễn chuỗi byte của các mẫu tin độ dài thay đổi
Biểu diễn chuỗi byte có các bất lợi sau:
- Khó sử dụng không gian bị chiếm hình thức bởi một mẩu tin bị xoá, điều này
dẫn đến một số lớn các mảnh nhỏ của lưu trữ đĩa bị lãng phí.
- Không có không gian cho sự phát triển các mẩu tin. Nếu một mẩu tin độ dài
thay đổi dài ra, nó phải được di chuyển và sự di chuyển này là đắt giá nếu mẩu tin bị
chốt.
- Biểu diễn chuỗi byte không thường được sử dụng để thực hiện mẩu tin độ dài
thay đổi, song một dạng sửa đổi của nó được gọi là cấu trúc khe-trang (slotted-page
structure) thường được dùng để tổ chức mẩu tin trong một khối đơn.
Trong cấu trúc slotted-page, có một header ở bắt đầu của mỗi khối, chứa các
8
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
thông tin sau:
- Số các đầu vào mẩu tin (record entries) trong header
- Điểm cuối không gian tự do (End of Free Space) trong khối
- Một mảng các đầu vào chứa vị trí và kích cỡ của mỗi mẩu tin
Các mẩu tin hiện hành được cấp phát kề nhau trong khối, bắt đàu từ cuối khối,
Không gian tự do trong khối là một vùng kề nhau, nằm giữa đầu vào cuối cùng trong
mảng header và mẩu tin đàu tiên. Khi một mẩu tin được chèn vào, không gian cấp phát
cho nó ở cuối của không gian tự do, và đầu vào tương ứng với nó được thêm vào
header.
Nếu một mẩu tin bị xoá, không gian bị chiếm bởi nó được giải phóng, đầu vào
ứng với nó được đặt là bị xoá (kích cỡ của nó được đặt chẳng hạn là -1). Sau đó, các
mẩu tin trong khối trước mẩu tin bị xoá được di chuyển sao cho không gian tự do của
khối lại là phần nằm giữa đầu vào cuối cùng của mảng header và mẩu tin đầu tiên. Con
trỏ điểm cuối không gian tự do và các con trỏ ứng với mẩu tin bị di chuyển được cập
nhật. Sự lớn lên hay nhỏ đi của mẩu tin cũng sử dụng kỹ thuật tương tự (trong trường
hợp khối còn không gian cho sự lớn lên của mẩu tin). Cái giá phải trả cho sự di chuyển
không quá cao vì các khối có kích cỡ không lớn ( thường 4Kbytes).
Biểu diễn độ dài cố định
Một cách khác để thực hiện mẩu tin độ dài thay đổi một cách hiệu quả trong
một hệ thống file là sử dụng một hoặc một vài mẩu tin độ dài cố định để biểu diễn một
mẩu tin độ dài thay đổi. Hai kỹ thuật thực hiện file của các mẩu tin độ dài thay đổi sử
dụng mẩu tin độ dài cố định là:
1. Không gian dự trữ (reserved space). Giả thiết rằng các mẩu tin có độ dài
không vượt quá một ngưỡng (độ dài tối đa). Ta có thể sử dụng mảu tin độ dài cố định
(có độ dài tối đa), Phần không gian chưa dùng đến được lấp đầy bởi một ký tự đặc
biệt: null hoặc End-of-record. Như vậy, tất cả các mẩu tin trong một khối có cùng độ
dài, cho dù file có thể chứa các mẩu tin không cùng độ dài.
9
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
2. Contrỏ (Pointers). Mẩu tin độ dài thay đổi được biểu diễn bởi một danh
sách các mẩu tin độ dài cố định, được "móc xích" với nhau bởi các con trỏ.
Sự bất lợi của cấu trúc con trỏ là lãng phí không gian trong tất cả các mẩu tin
ngoại trừ mẩu tin đầu tiên trong danh sách (mẩu tin đầu tiên cần trường branch_name,
các mẩu tin sau trong danh sách không cần thiết có trường này!). Để giải quyết vấn đề
này người ta đề nghị phân các khối trong file thành hai loại:
Khối neo (Anchor block). chứa chỉ các mẩu tin đầu tiên trong danh sách
Khối tràn (Overflow block). chứa các mẩu tin còn lại của danh sách
50
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
3.5.3. Tổ chức các mẫu tin trong file
Ta đã xét làm thế nào để biểu diễn các mẩu tin trong một cấu trúc file. Một thể
hiện của một quan hệ là một tập hợp các mẩu tin. Đã cho một tập hợp các mẩu tin, vấn
đề đặt ra là làm thế nào để tổ chức chúng trong một file. Có một số cách tổ chức sau:
Tổ chức file đống (Heap File Organization). Trong tổ chức này, một mẩu tin
bất kỳ có thể được lưu trữ ở bất kỳ nơi nào trong file, ở đó có không gian cho nó.
Không có thứ tự nào giữa các mẩu tin. Một file cho một quan hệ.
Tổ chức file tuần tự ( Sequential File Organization). Trong tổ chức này, các
mẩu tin được lưu trữ thứ tự tuần tự, dựa trên giá trị của khoá tìm kiếm của mỗi mẩu
tin.
Tổ chức file băm (Hashed File Organization). Trong tổ chức này, có một
hàm băm được tính toán trên thuộc tính nào đó của mẩu tin. Kết quả của hàm băm xác
định mẩu tin được bố trí trong khối nào trong file. Tổ chức này liên hệ chặt chẽ với
cấu trúc chỉ mục.
Tổ chức file cụm (Clustering File Organization). Trong tổ chức này, các mẩu
tin của một vài quan hệ khác nhau có thể được lưu trữ trong cùng một file. Các mẩu tin
có liên hệ của các quan hệ khác nhau được lưu trữ trên cùng một khối sao cho một
51
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
hoạt động I/O đem lại các mẩu tin có liên hệ từ tất cả các quan hệ.
3.5.4. Tổ chức file tuần tự
Tổ chức file tuần tự được thiết kế để xử lý hiệu quả các mẩu tin trong thứ tự
được sắp dựa trên một khoá tìm kiếm (search key) nào đó. Để cho phép tìm lại nhanh
chóng các mẩu tin theo thứ tự khoá tìm kiếm, ta "xích" các mẩu tin lại bởi các con trỏ.
Con trỏ trong mỗi mẩu tin trỏ tới mẩu tin kế theo thứ tự khoá tìm kiếm. Hơn nữa, để
tối ưu hoá số khối truy xuất trong xử lý file tuần tự, ta lưu trữ vật lý các mẩu tin theo
thứ tự khoá tìm kiếm hoặc gần với khoá tìm kiếm như có thể.
Tổ chức file tuần tự cho phép đọc các mẩu tin theo thứ tự được sắp mà nó có
thể hưu dụng cho mục đích trình bày cũng như cho các thuật toán xử lý vấn tin (query-
processing algorithms).
Khó khăn gặp phải của tổ chức này là việc duy trì thứ tự tuần tự vật lý của các
mẩu tin khi xảy ra các hoạt động chèn, xoá, do cái giá phải trả cho việc di chuyển các
mẩu tin khi chèn, xoá. Ta có thể quản trị vấn đề xoá bởi dùng dây chuyền các con trỏ
như đã trình bày trước đây. Đối với chèn, ta có thể áp dụng các quy tắc sau:
1. Định vị mẩu tin trong file mà nó đi trước mẩu tin được chèn theo thứ tự
khoá tìm kiếm.
2. Nếu có mẩu tin tự do (không gian của mẩu tin bị xoá) trong cùng khối, chèn
mẩu tin vào khối này. Nếu không, chèn mẩu tin mới vào một khối tràn. Trong cả hai
trường hợp, điều chỉnh các con trỏ sao cho nó móc xích các mẩu tin theo thứ tự của
52
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
khoá tìm kiếm.
3.5.5. Tổ chức file cụm
Nhiều hệ CSDL quan hệ, mỗi quan hệ được lưu trữ trong một file sao cho có
thể lợi dụng được toàn bộ những cái mà hệ thống file của điều hành cung cấp. Thông
thường, các bộ của một quan hệ được biểu diễn như các mẩu tin độ dài cố định. Như
vậy các quan hệ có thể ánh xạ vào một cấu trúc file. Sự thực hiện đơn giản đó của một
hệ CSDL quan hệ rất phù hợp với các hệ CSDL được thiết kế cho các máy tính cá
nhân. Trong các hệ thống đó, kích cỡ của CSDL nhỏ. Hơn nữa, trong một số máy tính
cá nhân, chủ yếu kích cỡ tổng thể mã đối tượng đối với hệ CSDL là nhỏ. Một cấu trúc
file đơn giản làm suy giảm lượng mã cần thiết để thực thi hệ thống.
Cách tiếp cận đơn giản này, để thực hiện CSDL quan hệ, không còn phù hợp
khi kích cỡ của CSDL tăng lên. Ta sẽ thấy những điểm lợi về mặt hiệu năng từ việc
gán một cách thận trọng các mẩu tin với các khối, và từ việc tổ chức kỹ lưỡng chính
bản thân các khối. Như vậy, có vẻ như là một cấu trúc file phức tạp hơn lại có lợi hơn,
ngay cả trong trường hợp ta giữ nguyên chiến lược lưu trữ mỗi quan hệ trong một file
riêng biệt.
Tuy nhiên, nhiều hệ CSDL quy mô lớn không nhờ cậy trực tiếp vào hệ điều
hành nền để quản trị file. Thay vào đó, một file hệ điều hành được cấp phát cho hệ
CSDL. Tất cả các quan hệ được lưu trữ trong một file này, và sự quản trị file này thuộc
53
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
về hệ CSDL. Để thấy những điểm lợi của việc lưu trữ nhiều quan hệ trong cùng một
file, ta xét vấn tin SQL sau:
SELECT account_number, customer_number, customer_treet, customer_city
FROM depositor, customer
WHERE depositor.customer_name = customer.customername;
Câu vấn tin này tính một phép nối của các quan hệ depositor và customer. Như
vậy, đối với mỗi bộ của depositor, hệ thống phải tìm bộ của customer có cùng giá trị
customer_name. Một cách lý tưởng là việc tìm kiếm các mẩu tin này nhờ sự trợ giúp
của chỉ mục. Bỏ qua việc tìm kiếm các mẩu tin như thế nào, ta chú ý vào việc truyền từ
đĩa vào bộ nhớ. Trong trường hợp xấu nhất, mỗi mẩu tin ở trong một khối khác nhau,
điều này buộc ta phải đọc một khối cho một mẩu tin được yêu cầu bởi câu vấn tin. Ta
sẽ trình bày một cấu trúc file được thiết kế để thực hiện hiệu quả các câu vấn tin liên
quan đến depositor customer. Các bộ depositor đối với mỗi customer_name được lưu
trữ gần bộ customer có cùng customer_name. Cấu trúc này trộn các bộ của hai quan hệ
với nhau, nhưng cho phép xử lý hiệu quả phép nối. Khi một bộ của của quan hệ
customer được đọc, toàn bộ khối chứa bộ này được đọc từ đĩa vào trong bộ nhớ chính.
Do các bộ tương ứng của depositor được lưu trữ trên đĩa gần bộ customer, khối chứa
bộ customer chứa các bộ của quan hệ depositor cần cho xử lý câu vấn tin. Nếu một
customer có nhiều account đến nỗi các mẩu tin depositor không lấp đầy trong một
khối, các mẩu tin còn lại xuất hiện trong khối kế cận. Cấu trúc file này, được gọi là
gom cụm (clustering), cho phép ta đọc nhiều mẩu tin được yêu cầu chỉ sử dụng một
đọc khối, như vậy ta có thể xử lý câu vấn tin đặc biệt này hiệu quả hơn.
Tuy nhiên, cấu trúc gom cụm trên lại tỏ ra không có lợi bằng tổ chức lưu mỗi
quan hệ trong một file riêng, đối với một số câu vấn tin, chẳng hạn:
SELECT *
FROM customer
Việc xác định khi nào thì gom cụm thường phụ thuộc vào kiểu câu vấn tin mà
người thiết kế CSDL nghĩ rằng nó xẩy ra thường xuyên nhất. Sử dụng thận trọng gom
cụm có thể cải thiện hiệu năng đáng kể trong việc xử lý câu vấn tin.
3.6. Lưu trữ tự điển dữ liệu
54
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Một hệ CSDL cần thiết duy trì dữ liệu về các quan hệ, như sơ đồ của các quan
hệ. Thông tin này được gọi là tự điển dữ liệu (data dictionary) hay mục lục hệ thống
(system catalog). Trong các kiểu thông tin mà hệ thống phải lưu trữ là:
- Các tên của các quan hệ
- Các tên của các thuộc tính của mỗi quan hệ
- Các miền (giá trị) và các độ dài của các thuộc tính
- Các tên của các View được định nghĩa trên CSDL và định nghĩa của các view
này
- Các ràng buộc toàn vẹn .
Nhiều hệ thống còn lưu trữ các thông tin liên quan đến người sử dụng hệ thống:
- Tên của người sử dụng được phép
- Giải trình thông tin về người sử dụng
Các dữ liệu thống kê và mô tả về các quan hệ có thể cũng được lưu trữ:
- Số bộ trong mỗi quan hệ
- Phương pháp lưu trữ được sử dụng cho mỗi quan hệ (cụm hay không)
Các thông tin về mỗi chỉ mục trên mỗi quan hệ cũng cần được lưu trữ :
- Tên của chỉ mục
- Tên của quan hệ được chỉ mục
- Các thuộc tính trên nó chỉ mục được định nghĩa
- Kiểu của chỉ mục được tạo
Toàn bộ các thông tin này trong thực tế bao hàm một CSDL nhỏ. Một số hệ
CSDL sử dụng những cấu trúc dữ liệu và mã mục đích đặc biệt để lưu trữ các thông tin
này. Nói chung, lưu trữ dữ liệu về CSDL trong chính CSDL vẫn được ưa chuộng hơn.
Bằng cách sử dụng CSDL để lưu trữ dữ liệu hệ thống, ta đơn giản hoá cấu trúc tổng
thể của hệ thống và cho phép sử dụng đầy đủ sức mạnh của CSDL trong việc truy xuất
nhanh đến dữ liệu hệ thống.
Sự chọn lựa chính xác biểu diễn dữ liệu hệ thống sử dụng các quan hệ như thế
nào là do người thiết kế hệ thống quyết định.
3.7. Chỉ mục
Ta xét hoạt động tìm sách trong một thư viện. Ví dụ ta muốn tìm một cuốn sách
của một tác giả nào đó. Đầu tiên ta tra trong mục lục tác giả, một tấm thẻ trong mục
lục này sẽ chỉ cho ta biết có thể tìm thấy cuốn sách đó ở đâu. Các thẻ trong một mục
55
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
lục được thư viện sắp xếp thứ tự theo vần chữ cái , như vậy giúp ta có thể tìm đến thẻ
cần tìm nhanh chóng không cần phải duyệt qua tất cả các thẻ. Chỉ mục của một file
trong các công việc hệ thống rất giống với một mục lục trong một thư viện. Tuy nhiên,
chỉ mục được làm như mục lục được mô tả như trên, trong thực tế, sẽ quá lớn để được
quản lý một cách hiệu quả. Thay vào đó, người ta sử dụng các kỹ thuật chỉ mục tinh tế
hơn. Có hai kiểu chỉ mục:
Chỉ mục được sắp (Ordered indices). được dựa trên một thứ tự sắp xếp theo
các giá trị
Chỉ mục băm (Hash indices). được dựa trên các giá trị được phân phối đều
qua các bucket. Bucket mà một giá trị được gán với nó được xác định bởi một hàm,
được gọi là hàm băm (hash function)
Đối với cả hai kiểu này, ta sẽ nêu ra một vài kỹ thuật, đáng lưu ý là không kỹ
thuật nào là tốt nhất. Mỗi kỹ thuật phù hợp với các ứng dụng CSDL riêng biệt. Mỗi kỹ
thuật phải được đánh giá trên cơ sở của các nhân tố sau:
Kiểu truy xuất: Các kiểu truy xuất được hỗ trợ hiệu quả. Các kiểu này bao hàm
cả tìm kiếm mẩu tin với một giá trị thuộc tính cụ thể hoặc tìm các mẩu tin với giá trị
thuộc tính nằm trong một khoảng xác định.
Thời gian truy xuất: Thời gian để tìm kiếm một hạng mục dữ liệu hay một tập
các hạng mục.
Thời gian chèn: Thời gian để chèn một hạng mục dữ liệu mới. giá trị này bao
hàm thời gian để tìm vị trí chèn thích hợp và thời gian cập nhật cấu trúc chỉ mục.
Thời gian xoá: Thời gian để xoá một hạng mục dữ liệu. giá trị này bao hàm
thời gian tìm kiếm hạng mục cần xoá, thời gian cập nhật cấu trúc chỉ mục.
Tổng phí tổn không gian: Không gian phụ bị chiếm bởi một cấu trúc chỉ mục.
Một file thường đi kèm với một vài chỉ mục. Thuộc tính hoặc tập hợp các thuộc tính
được dùng để tìm kiếm mẩu tin trong một file được gọi là khoá tìm kiếm. Chú ý rằng
định nghĩa này khác với định nghĩa khoá sơ cấp (primary key), khoá dự tuyển
(candidate key), và siêu khoá (superkey). Như vậy, nếu có một vài chỉ mục trên một
file, có một vài khoá tìm kiếm tương ứng.
3.7.1. Chỉ mục được sắp xếp
56
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Một chỉ mục lưu trữ các giá trị khoá tìm kiếm trong thứ tự được sắp, và kết hợp
với mỗi khoá tìm kiếm, các mẩu tin chứa khoá tìm kiếm này. Các mẩu tin trong file
được chỉ mục có thể chính nó cũng được sắp. Một file có thể có một vài chỉ mục trên
những khoá tìm kiếm khác nhau. Nếu file chứa các mẩu tin được sắp tuần tự, chỉ mục
trên khoá tìm kiếm xác định thứ tự này của file được gọi chỉ mục sơ cấp (primary
index). Các chỉ mục sơ cấp cũng được gọi là chỉ mục cụm (clustering index). Khoá tìm
kiếm của chỉ mục sơ cấp thường là khoá sơ cấp (khoá chính). Các chỉ mục, khoá tìm
kiếm của nó xác định một thứ tự khác với thứ tự của file, được gọi là các chỉ mục thứ
cấp (secondary indices) hay các chỉ mục không cụm (nonclustering indices).
Chỉ mục sơ cấp
Trong phần này, ta giả thiết rằng tất cả các file được sắp thứ tự tuần tự trên một
khoá tìm kiếm nào đó. Các file như vậy, với một chỉ mục sơ cấp trên khoá tìm kiếm
này, được gọi là file tuần tự chỉ mục (index-sequential files). Chúng biểu diễn một
trong các sơ đồ xưa nhất được dùng trong hệ CSDL. Chúng được thiết kế cho các ứng
dụng đòi hỏi cả xử lý tuần tự toàn bộ file lẫn truy xuất ngẫu nhiên đến một mẩu tin.
Chỉ mục đặc và chỉ mục thưa (Dense and Sparse Indices):Có hai loại chỉ mục
được sắp:
Chỉ mục đặc. Mỗi mẩu tin chỉ mục (đầu vào chỉ mục/ index entry) xuất hiện
đối với mỗi giá trị khoá tìm kiếm trong file. mẩu tin chỉ mục chứa giá trị khoá tìm
kiếm và một con trỏ tới mẩu tin dữ liệu đầu tiên với giá trị khoá tìm kiếm đó.
Chỉ mục thưa. Một mẩu tin chỉ mục được tạo ra chỉ với một số giá trị. Cũng
như với chỉ mục đặc, mỗi mẩu tin chỉ mục chứa một giá trị khoá tìm kiếm và một con
trỏ tới mẩu tin dữ liệu đầu tiên với giá trị khoá tìm kiếm này. Để định vị một mẩu tin,
57
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
ta tìm đầu vào chỉ mục với giá trị khoá tìm kiếm lớn nhất trong các giá trị khoá tìm
kiếm nhỏ hơn hoặc bằng giá trị khoá tìm kiếm đang tìm. Ta bắt đầu từ mẩu tin được
trỏ tới bởi đầu vào chỉ mục, và lần theo các con trỏ trong file (dữ liệu) đến tận khi tìm
thấy mẩu tin mong muốn.
Ví dụ 3.1. Giả sử ta tìm các kiếm mẩu tin đối với chi nhánh Perryridge, sử dụng chỉ
mục đặc. Đầu tiên, tìm Perryridge trong chỉ mục (tìm nhị phân!), đi theo con trỏ tương
ứng đến mẩu tin dữ liệu (với Branch_name = Perryridge) đầu tiên, xử lý mẩu tin này,
sau đó đi theo con trỏ trong mẩu tin này để định vị mẩu tin kế trong thứ tự khoá tìm
kiếm, xử lý mẩu tin này, tiếp tục như vậy đến tận khi đạt tới mẩu tin có Branch_name
khác với Perryridge.
Đối với chỉ mục thưa, đầu tiên tìm trong chỉ mục, đầu vào có Branch_name lớn
nhất trong các đầu vào có Branch_name nhỏ hơn hoặc bằng Perryridge, ta tìm được
đầu vào với Mianus, lần theo con trỏ tương ứng đến mẩu tin dữ liệu, đi theo con trỏ
trong mẩu tin Mianus để định vị mẩu tin kế trong thứ tự khoá tìm kiếm và cứ như vậy
đến tận khi đạt tới mẩu tin dữ liệu Perryridge đầu tiên, sau đó xử lý bắt đầu từ điểm
này.
Chỉ mục đặc cho phép tìm kiếm mẩu tin nhanh hơn chỉ mục thưa, song chỉ mục
thưa lại đòi hỏi ít không gian hơn chỉ mục đặc. Hơn nữa, chỉ mục thưa yêu cầu một tổn
phí duy trì nhỏ hơn đối với các hoạt động chèn, xoá.
Người thiết kế hệ thống phải cân nhắc sự cân đối giữa thời truy xuất và tổn phí
không gian. Một thoả hiệp tốt là có một chỉ mục thưa với một đầu vào chỉ mục cho
mỗi khối, vì như vậy cái giá nổi trội trong xử lý một yêu cầu CSDL là thời gian mang
58
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
một khối từ đĩa vào bộ nhớ chính. Mỗi khi một khối được mang vào, thời gian quét
toàn bộ khối là không đáng kể. Sử dụng chỉ mục thưa, ta tìm khối chứa mẩu tin cần
tìm. Như vậy, trừ phi mẩu tin nằm trên khối tràn, ta tối thiểu hoá được truy xuất khối,
trong khi giữ được kích cỡ của chỉ mục nhỏ như có thể.
Chỉ mục nhiều mức
Chỉ mục có thể rất lớn, ngay cả khi sử dụng chỉ mục thưa, và không thể chứa đủ
trong bộ nhớ một lần. Tìm kiếm đầu vào chỉ mục đối với các chỉ mục như vậy đòi hỏi
phải đọc vài khối đĩa. Tìm kiếm nhị phân có thể được sử dụng để tìm một đầu vào trên
file chỉ mục, song vẫn phải truy xuất khoảng logB khối, với B là số khối đĩa chứa chỉ
mục. Nếu B lớn, thời gian truy xuất này là đáng kể! Hơn nữa nếu sử dụng các khối
tràn, tìm kiếm nhị phân không sử dụng được và như vậy việc tìm kiếm phải làm tuần
tự. Nó đòi hỏi truy xuất lên đến B khối!
Để giải quyết vấn đề này, Ta xem file chỉ mục như một file tuần tự và xây dựng
chỉ mục thưa cho nó. Để tìm đầu vào chỉ mục, ta tìm kiếm nhị phân trên chỉ mục
"ngoài" để được mẩu tin có khoá tìm kiếm lớn nhất trong các mẩu tin có khoá tìm
kiếm nhỏ hơn hoặc bằng khoá muốn tìm.
Con trỏ tương ứng trỏ tới khối của chỉ mục "trong". Trong khối này, tìm kiếm
mẩu tin có khoá tìm kiếm lớn nhất trong các mẩu tin có khoá tìm kiếm nhỏ hơn hoặc
bằng khoá muốn tìm, trường con trỏ của mẩu tin này trỏ đến khối chứa mẩu tin cần
tìm. Vì chỉ mục ngoài nhỏ, có thể nằm sẵn trong bộ nhớ chính, nên một lần tìm kiếm
chỉ cần một truy xuất khối chỉ mục. Ta có thể lặp lại quá trình xây dựng trên nhiều lần
59
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
khi cần thiết. Chỉ mục với không ít hơn hai mức được gọi là chỉ mục nhiều mức. Với
chỉ mục nhiều mức, việc tìm kiếm mẩu tin đòi hỏi truy xuất khối ít hơn đáng kể so với
tìm kiếm nhị phân.
3.7.2. Cập nhật chỉ mục
Mỗi khi chèn hoặc xoá một mẩu tin, bắt buộc phải cập nhật các chỉ mục kèm
với file chứa mẩu tin này. Dưới đây, ta mô tả các thuật toán cập nhật cho các chỉ mục
một mức
Xoá: Để xoá một mẩu tin, đầu tiên phải tìm mẩu tin muốn xoá. Nếu mẩu tin bị
xoá là mẩu tin đầu tiên trong dây chuyền các mẩu tin được xác định bởi con trỏ của
đầu vào chỉ mục trong quá trình tìm kiếm, có hai trường hợp phải xét: nếu mẩu tin bị
xoá là mẩu tin duy nhất trong dây chuyền, ta xoá đầu vào trong chỉ mục tương ứng,
nếu không, ta thay thế khoá tìm kiếm trong đầu vào chỉ mục bởi khoá tìm kiếm của
mẩu tin kề sau mẩu tin bị xoá trong dây chuyền, con trỏ bởi địa chỉ mẩu tin kề sau đó.
Trong trường hợp khác, việc xoá mẩu tin không dẫn đến việc điều chỉnh chỉ mục.
Chèn: Trước tiên, tìm kiếm dựa trên khoá tìm kiếm của mẩu tin được chèn.
Nếu là chỉ mục đặc và giá trị khoá tìm kiếm không xuất hiện trong chỉ mục, chèn giá
trị khoá này và con trỏ tới mẩu tin vào chỉ mục. Nếu là chỉ mục thưa và lưu đầu vào
cho mỗi khối, không cần thiết phải thay đổi trừ phi khối mới được tạo ra. Trong trường
hợp đó, giá trị khoá tìm kiếm đầu tiên trong khối mới được chèn vào chỉ mục.
Giả thuật chèn và xoá đối với chỉ mục nhiều mức là một mở rộng đơn giản của
các giả thuật vừa được mô tả.
3.7.3. Chỉ mục thứ cấp
Chỉ mục thứ cấp trên một khoá dự tuyển giống như chỉ mục sơ cấp đặc ngoại
trừ các mẩu tin được trỏ đến bởi các giá trị liên tiếp trong chỉ mục không được lưu trữ
tuần tự. Nói chung, chỉ mục thứ cấp có thể được cấu trúc khác với chỉ mục sơ cấp. Nếu
khoá tìm kiếm của chỉ mục sơ cấp không là khoá dự tuyển, chỉ mục chỉ cần trỏ đến
mẩu tin đầu tiên với một giá trị khoá tìm kiếm riêng là đủ (các mẩu tin khác cùng giá
trị khoá này có thể tìm lại được nhờ quét tuần tự file).
Nếu khoá tìm kiếm của một chỉ mục thứ cấp không là khoá dự tuyển, việc trỏ
tới mẩu tin đầu tiên với giá trị khoá tìm kiếm riêng không đủ, do các mẩu tin trong file
60
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
không còn được sắp tuần tự theo khoá tìm kiếm của chỉ mục thứ cấp, chúng có thể
nằm ở bất kỳ vị trí nào trong file. Bởi vậy, chỉ mục thứ cấp phải chứa tất cả các co trỏ
tới mỗi mẩu tin. Ta có thể sử dụng mức phụ gián tiếp để thực hiện chỉ mục thứ cấp
trên các khoá tìm kiếm không là khoá dự tuyển. Các con trỏ trong chỉ mục thứ cấp như
vậy không trực tiếp trỏ tới mẩu tin mà trỏ tới một bucket chứa các con trỏ tới file.
Chỉ mục thứ cấp phải là đặc, với một đầu vào chỉ mục cho mỗi mẩu tin. Chỉ
mục thứ cấp cải thiện hiệu năng các vấn tin sử dụng khoá tìm kiếm không là khóa của
chỉ mục sơ cấp, tuy nhiên nó lại đem lại một tổn phí sửa đổi CSDL đáng kể.Việc quyết
định các chỉ mục thứ cấp nào là cần thiết dựa trên đánh giá của nhà thiết kế CSDL về
tần xuất vấn tin và sửa đổi.
3.8. File chỉ mục B+-Cây
Tổ chức file chỉ mục tuần tự có một nhược điếm chính là làm giảm hiệu năng
khi file lớn lên. Để khắc phục nhược điểm đó đòi hỏi phải tổ chức lại file. Cấu trúc chỉ
mục B+-cây là cấu trúc được sử dụng rộng rãi nhất trong các cấu trúc đảm bảo được
tính hiệu quả của chúng bất chấp các hoạt động chèn, xoá. Chỉ mục B+-cây là một
dạng cây cân bằng (mọi đường dẫn từ gốc đến lá có cùng độ dài). Mỗi nút không là lá
có số con nằm trong khoảng giữa m/2, trong đó m là một số cố định được gọi là bậc
của B+-cây. Ta thấy rằng cấu trúc B+-cây cũng đòi hỏi một tổn phí hiệu năng trên
chèn và xoá cũng như trên không gian. Tuy nhiên, tổn phí này là chấp nhận được ngay
cả đối với các file có tần suất sửa đổi cao.
Cấu trúc của B+-cây
Một chỉ mục B+-cây là một chỉ mục nhiều mức, nhưng có cấu trúc khác với file
61
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
tuần tự chỉ mục nhiều mức (multilevel index-sequential). Một nút tiêu biểu của B+-cây
chứa đến n-1 giá trị khoá tìm kiếm. K1, K2, ..., Kn-1, và n con trỏ P1, P2, ..., Pn, các giá
trị khoá trong nút được sắp thứ tự: i < j ⇒ Ki < Kj.
Trước tiên, ta xét cấu trúc của nút lá. Đối với i = 1, 2, ..., n-1, con trỏ Pi trỏ tới
hoặc mẩu tin với giá trị khoá Ki hoặc tới một bucket các con trỏ mà mỗi một trong
chúng trỏ tới một mẩu tin với giá trị khoá Ki. Cấu trúc bucket chỉ được sử dụng trong
các trường hợp: hoặc khoá tìm kiếm không là khoá sơ cấp hoặc file không được sắp
theo khoá tìm kiếm. Con trỏ Pn được dùng vào mục đích đặc biệt: Pn được dùng để
móc xích các nút lá lại theo thứ tự khoá tìm kiếm, điều này cho phép xử lý tuần tự file
hiệu quả. Bây giờ ta xem các giá trị khoá tìm kiếm được gắn với một nút lá như thế
nào. Mỗi nút nút lá có thể chứa đến n-1 giá trị. Khoảng giá trị mà mỗi nút lá chứa là
không chồng chéo. Như vậy, nếu Li và Lj là hai nút lá với i < j thì mỗi giá trị khoá
trong nút Li nhỏ hơn mọi giá trị khoá trong Lj . Nếu chỉ mục B+-cây là đặc, mỗi giá trị
khoá tìm kiếm phải xuất hiện trong một nút lá nào đó.
Các nút không là lá của một B+-cây tạo ra một chỉ mục nhiều mức trên các nút
lá. Cấu trúc của các nút không là lá tương tự như cấu trúc nút lá ngoại trừ tất cả các
con trỏ đều trỏ đến các nút của cây. Các nút không là lá có thể chứa đến m con trỏ và
phải chứa không ít hơn m/2 con trỏ ngoại trừ nút gốc. Nút gốc được phép chứa ít
nhất 2 con trỏ. Số con trỏ trong một nút được gọi là số nan (fanout) của nút.
62
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Con trỏ Pi của một nút không là lá (chứa p con trỏ, 1 < i < p) trỏ đến một cây
con chứa các giá trị khoá tìm kiếm nhỏ hơn Ki và lớn hơn hoặc bằng Ki-1. Con trỏ P1
trỏ đến cây con chứa các giá trị khoá tìm kiếm nhỏ hơn K1. Con trỏ Pp trỏ tới cây con
chứa các khoá tìm kiếm lớn hơn Kp-1.
3.8.1. Các vấn tin trên B+- cây
Ta xét xử lý vấn tin sử dụng B+-cây như thế nào ? Giả sử ta muốn tìn tất cả các
mẩu tin với giá trị khoá tìm kiếm k. Đầu tiên, ta kiểm tra nút gốc, tìm giá trị khoá tìm
kiếm nhỏ nhất lớn hơn k, giả sử giá trị khoá đó là Ki. Đi theo con trỏ Pi để đi tới một
nút khác. Nếu nút có p con trỏ và k > Kp-1, đi theo con trỏ Pp. Đến một nút tới, lặp lại
quá trình tìm kiếm giá trị khoá tìm kiếm nhỏ nhất lớn hơn k và theo con trỏ tương ứng
để đi tới một nút khác và tiếp tục như vậy đến khi đạt tới một nút lá. Con trỏ tương
ứng trong nút lá hướng ta tới mẩu tin/bucket mong muốn Số khối truy xuất không vượt
quá logm/2 , trong đó K là số giá trị khoá tìm kiếm trong B+- cây, m là bậc của cây.
3.8.2. Cập nhật trên B+-cây
Chèn: Sử dụng cùng kỹ thuật như tìm kiếm, ta tìm nút lá trong đó giá trị khoá
tìm kiếm cần chèn sẽ xuất hiện. Nếu khoá tìm kiếm đã xuất hiện rồi trong nút lá, chèn
mẩu tin vào trong file, thêm con trỏ tới mẩu tin vào trong bucket tương ứng. Nếu khoá
tìm kiếm chưa hiện diện trong nút lá, ta chèn mẩu tin vào trong file rồi chèn giá trị
khoá tìm kiếm vào trong nút lá ở vị trí đúng (bảo tồn tính thứ tự), tạo một bucket mới
với con trỏ tương ứng. Nếu nút lá không còn chỗ cho giá trị khoá mới, Một khối mới
được yêu cầu từ hệ điều hành, các giá trị khoá trong nút lá được tách một nửa cho nút
mới, giá trị khoá mới được chèn vào vị trí đúng của nó vào một trong hai khối này.
Điều này kéo theo việc chèn giá trị khoá đầu khối mới và con trỏ tới khối mới vào nút
cha. Việc chèn cặp giá trị khoá và con trỏ vào nút cha này lại có thể dẫn đến việc tách
nút ra làm hai. Quá trình này có thể dẫn đến tận nút gốc. Trong trường hợp nút gốc bị
tách làm hai, một nút gốc mới được tạo ra và hai con của nó là hai nút được tách ra từ
nút gốc cũ, chiều cao cây tăng lên một.
Procedure Insert(value V, pointer P)
Tìm nút lá L sẽ chứa giá trị V
Insert_entry(L, V, P)
end procedure
63
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Procedure Insert_entry(node L, value V, pointer P)
If (L có không gian cho (V, P) then
Chèn (V, P) vào L
else begin /* tách L */
Tạo nút L'
If ( L là nút lá) then begin
V' là giá trị sao cho m/2 giá trị trong các giá trị L.K1, L.K2, .., L.Km-1, V
nhỏ hơn V' n là chỉ số nhỏ nhất sao cho L.Kn ≥ V'
Di chuyển L.Pn, L.Kn, ..., L.Pm-1, L.Kn-1 sang L'
If (V < V') then chèn (V, P) vào trong L else chèn (P, V) vào trong L'
end else begin
V' là giá trị sao cho m/2 giá trị trong các giá trị L.K1, L.K2, ..., L.Km-1, V lớn
hơn hoặc bằng V'
n là chỉ số nhỏ nhất sao cho L.Kn ≥ V'
Thêm Nil, L.Kn, L.Pn+1, Kn+1, ..., L.Pm-1, L.Km-1, L.Pm vào L'
Xoá L.Kn, L.Pn+1, L.Kn+1, ..., L.Pm-1, L.Km-1, L.Pm khỏi L
If (V < V') then chèn (P, V) vào trong L else chèn P, V) vào trong L' xoá (Nil,
V') khỏi L'
end
if (L không là nút gốc) then Insert_entry(parent(L), V', L') else begin
Tạo ra nút mới R với các nút con là L và L' với giá trị duy
nhất trong nó là V' Tạo R là gốc của cây
end
If (L) là một nút lá then begin đặt L'.Pm = L.Pm
đặt L.Pm = L'
end
end
end procedure
64
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Xoá: Sử dụng kỹ thuật tìm kiếm tìm mẩu tin cần xoá, xoá nó khỏi file, xoá giá
trị khoá tìm kiếm khỏi nút lá trong B+-cây nếu không có bucket kết hợp với giá trị
khoá tìm kiếm hoặc bucket trở nên rỗng sau khi xoá con trỏ tương ứng trong nó. Việc
xoá một giá trị khoá khỏi một nút của B+-cây có thể dẫn đến nút lá trở nên rỗng, phải
trả lại, từ đó nút cha của nó có thể có số con nhỏ hơn ngưỡng cho phép, trong trường
hợp đó hoặc phải chuyển một con từ nút anh em của nút cha đó sang nút cha nếu điều
đó có thể (nút anh em của nút cha này còn số con ≥ m/2 sau khi chuyển đi một con).
Nếu không, phải gom nút cha này với một nút anh em của nó, điều này dẫn tới xoá
một nút trong khỏi cây, rồi xoá khỏi nút cha của nó một hạng, ... quá trình này có thể
dẫn đến tận gốc. Trong trường hợp nút gốc chỉ còn một con sau xoá, cây phải thay nút
gốc cũ bởi nút con của nó, nút gốc cũ phải trả lại cho hệ thống, chiều cao cây giảm đi
một.
Procedure delete(value V, pointer P)
Tìm nút lá chứa (V, P)
delete_entry(L, V, P)
end procedure
Procedure delete_entry(node L, value V, pointer P)
xoá (V, P) khỏi L
If (L là nút gốc and L chỉ còn lại một con) then
Lấy con của L làm nút gốc mới của cây, xoá L
else If (L có quá ít giá trị/ con trỏ) then begin
L' là anh em kề trái hoặc phải của L
V' là giá trị ở giữa hai con trỏ L, L' (trong nút parent(L))
If (các đầu vào của L và L' có thể lấp đầy trong một khối) then begin
If (L là nút trước của L') then wsap_variables(L, L')
If (L không là lá) then nối V' và tất cả con trỏ, giá trị trong L với L'
else begin nối tất cả các cặp (K, P) trong L với L'; L'.Pp = L.Pp end
delete_entry(parent(L), V', L); xoá nút L
end
else begin
If (L' là nút trước của L) then begin
If (L không là nút lá) then begin
65
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
p là chỉ số sao cho L'.Pp là con trỏ cuối trong L' xoá (L'.Kp-1, L'.Pp) khỏi L'
chèn (L'.Pp, V') như phần tử đầu tiên trong L (right_shift tất cả các phần tử của
L) thay thế V' trong parent(L) bởi L'.Kp-1
end else begin
p là chỉ số sao cho L'.Pp là con trỏ cuối trong L' xoá (L'.Pp, L'.Kp) khỏi L'
chèn (L'.Pp, L'.Kp) như phần tử đầu tiên trong L (right_shift tất cả các phần tử của L)
thay thế V' trong parent(L) bởi L'.Kp
end
end < đối xứng với trường hợp then >
end
end procedure
3.8.4. Tổ chức file B+-cây
Trong tổ chức file B+-cây, các nút lá của cây lưu trữ các mẩu tin, thay cho các
con trỏ tới file. Vì mẩu tin thường lớn hơn con trỏ, số tối đa các mẩu tin được lưu trữ
trong một khối lá ít hơn số con trỏ trong một nút không lá. Các nút lá vẫn được yêu
cầu được lấp đầy ít nhất là một nửa. Chèn và xoá trong tổ chức file B+-cây tương tự
như trong chỉ mục B+-cây. Khi B+-cây được sử dụng để tổ chức file, việc sử dụng
không gian là đặc biệt quan trọng, vì không gian bị chiếm bởi mẩu tin là lớn hơn
nhiều so với không gian bị chiếm bởi (khoá,con trỏ). Ta có thể cải tiến sự sử sụng
không gian trong B+-cây bằng cách bao hàm nhiều nút anh em hơn khi tái phân phối
trong khi tách và trộn. Khi chèn, nếu một nút là đầy, ta thử phân phối lại một số đầu
vào đến một trong các nút kề để tạo không gian cho đầu vào mới. Nếu việc thử này
thất bại, ta mới thực hiện tách nút và phân chia các đầu vào giữa một trong các nút kề
và hai nút nhận được do tách nút. Khi xoá, nếu nút chứa ít hơn 2m/3 đầu vào, ta thử
mượn một đầu vào từ một trong hai nút anh em kề. Nếu cả hai đều có đúng 2m/3
mẩu tin, ta phân phối lại các đầu vào của nút cho hai nút anh em kề và xoá nút thứ 3.
Nếu k nút được sử dụng trong tái phân phối (k-1 nút anh em), mỗi nút đảm bảo chứa ít
nhất ≤ (k-1)m/k đầu vào. Tuy nhiên, cái giá phải trả cho cập nhật của cách tiếp cận
này sẽ cao hơn.
3.9. File chỉ mục B-Cây
66
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Chỉ mục B-cây tương tự như chỉ mục B+-cây. Sự khác biệt là ở chỗ B-cây loại
bỏ lưu trữ dư thừa các giá trị khoá tìm kiếm. Trong B-cây, các giá trị khoá chỉ xuất
hiện một lần. Do các khoá tìm kiếm xuất hiện trong các nút không là lá không xuất
hiện ở bất kỳ nơi nào khác nữa trong B-cây, ta phải thêm một trường con trỏ cho mỗi
khoá tìm kiếm trong các nút không là lá. Con trỏ thêm vào này trỏ tới hoặc mẩu tin
trong file hoặc bucket tương ứng.
Một nút lá B-cây tổng quát có dạng:
Một nút không là lá có dạng:
Các con trỏ Pi là các con trỏ cây và được dùng như trong B+-cây. Các con trỏ
Bi trong các nút không là lá là các con trỏ mẩu tin hoặc con trỏ bucket. Rõ ràng là số
giá trị khoá trong nút không lá nhỏ hơn số giá trị trong nút lá. Số nút được truy xuất
trong quá trình tìm kiếm trong một B-cây phụ thuộc nơi khoá tìm kiếm được định vị.
Xoá trong một B-cây phức tạp hơn trong một B+-cây. Xoá một đầu vào xuất
hiện ở một nút không là lá kéo theo việc tuyển chọn một giá trị thích hợp trong cây
con của nút chứa đầu vào bị xoá. Nếu khoá Ki bị xoá, khoá nhỏ nhất trong cây con
được trỏ bởi Pi+1 phải được di chuyển vào vị trí của Ki. Nếu nút lá còn lại quá ít đầu
vào, cần thiết các hoạt động bổ Sung.
3.10. Băm
3.10.1. Băm tĩnh
Bất lợi của tổ chức file tuần tự là ta phải truy xuất một cấu trúc chỉ mục để định
vị dữ liệu, hoặc phải sử dụng tìm kiếm nhị phân, và kết quả là có nhiều hoạt động I/O.
Tổ chức file dựa trên kỹ thuật băm cho phép ta tránh được truy xuất một cấu trúc chỉ
mục. Băm cung cung cấp một phương pháp để xây dựng các chỉ mục.
Tổ chức file băm
Trong tổ chức file băm, ta nhận được địa chỉ của khối đĩa chứa một mẩu tin
mong muốn bởi tính toán một hàm trên giá trị khoá tìm kiếm của mẩu tin. thuật ngữ
67
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
bucket được dùng để chỉ một đơn vị lưu trữ. Một bucket kiểu mẫu là một khối đĩa,
nhưng có thể được chọn nhỏ hơn hoặc lớn hơn một khối đĩa.
K ký hiệu tập tất cả các giá trị khoá tìm kiếm, B ký hiệu tập tất cả các địa chỉ bucket.
Một hàm băm h là một hàm từ K vào B : h: K → B
Chèn một mẩu tin với giá trị khoá K vào trong file: ta tính h(K). Giá trị của
h(K) là địa chỉ của bucket sẽ chứa mẩu tin. Nếu có không gian trong bucket cho mẩu
tin, mẩu tin được lưu trữ trong bucket.
Tìm kiếm một mẩu tin theo giá trị khoá K: đầu tiên tính h(K), ta tìm được bucket
tương ứng. sau dó tìm trong bucket này mẩu tin với giá trị khoá K mong muốn.
Xoá mẩu tin với giá trị khoá K: tính h(K), tìm trong bucket tương ứng mẩu tin mong
muốn, xoá nó khỏi bucket.
Hàm băm
Hàm băm xấu nhất là hàm ánh xạ tất cả các giá trị khoá vào cùng một bucket.
Hàm băm lý tưởng là hàm phân phối đều các giá trị khoá vào các bucket, như vậy mỗi
bucket chứa một số lượng mẩu tin như nhau. Ta muốn chọn một hàm băm thoả mãn
các tiêu chuẩn sau:
Phân phối đều: Mỗi bucket được gán cùng một số giá trị khoá tìm kiếm trong tập hợp
tất cả các giá trị khoá có thể
Phân phối ngẫu nhiên: Trong trường hợp trung bình, các bucket được gán một số
lượng giá trị khoá tìm kiếm gần bằng nhau.
Các hàm băm phải được thiết kế thận trọng. Một hàm băm xấu có thể dẫn đến việc tìm
kiếm chiếm một thời gian tỷ lệ với số khoá tìm kiếm trong file.
Điều khiển tràn bucket
Khi chèn một mẩu tin, nếu bucket tương ứng còn chỗ, mẩu tin được chèn vào
bucket, nếu không sẽ xảy ra tràn bucket. Tràn bucket do các nguyên do sau:
- Các bucket không đủ. Số các bucket nB phải thoả mãn nB > nr / fr trong đó nr
là tổng số mẩu tin sẽ lưu trữ, fr là số mẩu tin có thể lấp đầy trong một bucket.
- Sự lệch. Một vài bucket được gán cho một số lượng mẩu tin nhiều hơn các
bucket khác, như vậy một bucket có thể tràn trong khi các bucket khác vẫn còn không
gian. Tình huống này được gọi là sự lệch bucket. Sự lệch xảy ra do hai nguyên nhân:
68
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
1. Nhiều mẩu tin có cùng khoá tìm kiếm
2. Hàm băm được chọn phân phối các giá trị khoá không đều
Ta quản lý tràn bucket bằng cách dùng các bucket tràn. Nếu một mẩu tin phải
được chèn vào bucket B nhưng bucket B đã đầy, khi đó một bucket tràn sẽ được cấp
cho B và mẩu tin được chèn vào bucket tràn này. Nếu bucket tràn cũng đầy một bucket
tràn mới lại được cấp và cứ như vậy. Tất cả các bucket tràn của một bucket được “móc
xích” với nhau thành một danh sách liên kết. Việc điều khiển tràn dùng danh sách liên
kết như vậy được gọi là dây chuyền tràn. Đối với dây chuyền tràn, thuật toán tìm kiếm
thay đổi chú ít: trước tiên ta cũng tính giá trị hàm băm trên khoá tìm kiếm, ta được
bucket B, kiểm tra các mẩu tin, trong bucket B và tất cả các bucket tràn tương ứng, có
giá trị khoá khớp với giá trị tìm không.
Một cách điều khiển tràn bucket khác là: Khi cần chèn một mẩu tin vào một
bucket nhưng nó đã đầy, thay vì cấp thêm một bucket tràn, ta sử dụng một hàm băm kế
trong một dãy các hàm băm được chọn để tìm bucket khác cho mẩu tin, nếu bucket sau
cũng đầy, ta lại sử dụng một hàm băm kế và cứ như vậy... Dãy các hàm băm thường
được sử dụng là {hi (K) = (hi-1(K) +1) mod nB với 1 ≤ i ≤ nB-1 và h0 là hàm băm cơ sở
}.
Dạng cấu trúc băm sử dụng dây chuyền bucket được gọi là băm mở. Dạng sử
dụng dãy các hàm băm được gọi là băm đóng. Trong các hệ CSDL, cấu trúc băm đóng
thường được ưa dùng hơn.
Chỉ mục băm
Một chỉ mục băm tổ chức các khoá tìm kiếm cùng con trỏ kết hợp vào một cấu
trúc file băm như sau: áp dụng một hàm băm trên khoá tìm kiếm để định danh bucket
sau đó lưu giá trị khoá và con trỏ kết hợp vào bucket này (hoặc vào các bucket tràn).
Chỉ mục băm thường là chỉ mục thứ cấp.
Hàm băm trên số tài khoản được tính theo công thức: h(Account_number) =
(tổng các chữ số trong số tài khoản) mod 7
3.10.2. Băm động
Trong kỹ thuật băm tĩnh (static hashing), tập B các địa chỉ bucket phải là cố
định. Các CSDL phát triển lớn lên theo thời gian. Nếu ta sử dụng băm tĩnh cho CSDL,
ta có ba lớp lựa chọn:
69
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
1. Chọn một hàm băm dựa trên kích cỡ file hiện hành. Sự lụa chọn này sẽ dẫn
đến sự suy giảm hiệu năng khi CSDL lớn lên.
2. Chọn một hàm băm dựa trên kích cỡ file dự đoán trước cho một thời điểm
nào đó trong tương lai. Mặc dù sự suy giảm hiệu năng được cải thiện, một lượng đáng
kể không gian có thể bị lãng phí lúc khởi đầu.
3. Tổ chức lại theo chu kỳ cấu trúc băm đáp ứng sự phát triển kích cỡ file. Một
sự tổ chức lại như vậy kéo theo việc lựa chọn một hàm băm mới, tính lại hàm băm trên
mỗi mẩu tin trong file và sinh ra các gán bucket mới. Tổ chức lại là một hoạt động tốn
thời gian. Hơn nũa, nó đòi hỏi cấm truy xuất file trong khi đang tổ chức lại file.
Kỹ thuật băm động cho phép sửa đổi hàm băm để phù hợp với sự tăng hoặc
giảm của CSDL. Một dạng băm động được gọi là băm có thể mở rộng (extendable
hashing) được thực hiện như sau: Chọn một hàm băm h với các tính chất đều, ngẫu
nhiên và có miền giá trị tương đối rộng, chẳng hạn, là một số nguyên b bit (b thường là
32). Khi khởi đầu ta không sử dụng toàn bộ b bit giá trị băm. Tại một thời điểm, ta chỉ
sử dụng i bit 0 ≤ i ≤ b. i bit này được dùng như một độ dời (offset) trong một bảng địa
chỉ bucket phụ. giá trị i tăng lên hay giảm xuống tuỳ theo kích cỡ CSDL.
Số i xuất hiện bên trên bảng địa chỉ bucket chỉ ra rằng i bit của giá trị băm h(K)
được đòi hỏi để xác định bucket đúng cho K, số này sẽ thay đổi khi kích cỡ file thay
đổi. Mặc dù i bit dược đòi hỏi để tìm đầu vào đúng trong bảng địa chỉ bucket, một số
đầu vào bảng kề nhau có thể trỏ đến cùng một bucket.
Để định vị bucket chứa giá trị khoá tìm kiếm K , ta lấy i bit cao đầu tiên của
h(K), tìm trong đầu vào bảng tương ứng với chuỗi bit này và lần theo con trỏ trong đầu
vào bảng này. Để chèn một mẩu tin với giá trị khoá tìm kiếm K, tiến hành thủ tục dịnh
vị trên, ta được bucket, giả sử là bucket j. Nếu còn cho cho mẩu tin, chèn mẩu tin vào
trong bucket đó. Nếu không, ta phải tách bucket ra và phân phối lại các mẩu tin hiện
có cùng mẩu tin mới. Để tách bucket, đầu tiên ta xác định từ giá trị băm có cần tăng số
bit lên hay không. Nếu i = ij , chỉ có một đầu vào trong bảng địa chỉ bucket trỏ đến
bucket j. ta cần tăng kích cỡ của bảng địa chỉ bucket sao cho ta có thể bao hàm các con
trỏ đến hai bucket kết quả của việc tách bucket j bằng cách xét thêm một bit của giá trị
băm. tăng giá trị i lên một, như vậy kích cỡ của bảng địa chỉ bucket tăng lên gấp đôi.
Mỗi một đầu vào được thay bởi hai đầu vào, cả hai cùng chứa con trỏ của đầu vào gốc.
Bây giờ hai đầu vào trong bảng địa chỉ bucket trỏ tới bucket j. Ta định vị một bucket
70
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
mới (bucket z), và đặt đầu vào thứ hai trỏ tới bucket mới, đặt ij và iz về i, tiếp theo đó
mỗi một mẩu tin trong bucket j được băm lại, tuỳ thuộc vào i bit đầu tiên, sẽ hoặc ở lại
bucket j hoặc được cấp phát cho bucket mới được tạo.
-Nếu i > ij khi đó nhiều hơn một đầu vào trong bảng địa chỉ bucket trỏ tới
bucket j. như vậy ta có thể tách bucket j mà không cần tăng kích cỡ bảng địa chỉ
bucket. Ta cấp phát một bucket mới (bucket z) và đặt ij và iz đến giá trị là kết quả của
việc thêm 1 vào giá trị ij gốc. Kế đến, ta điều chỉnh các đầu vào trong bảng địa chỉ
bucket trước đây trỏ tới bucket j. Ta để lại nửa đầu các đầu vào, và đặt tất cả các đầu
vào còn lại trỏ tới bucket mới tạo (z). Tiếp theo, mỗi mẩu tin trong trong bucket j được
băm lại và được cấp phát cho hoặc vào bucket j hoặc bucket z.
Để xoá một mẩu tin với giá trị khoá K, trước tiên ta thực hiện thủ tục định vị,
ta tìm được bucket tương ứng, gọi là j, ta xoá cả khoá tìm kiếm trong bucket lẫn mẩu
tin mẩu tin trong file. bucket cũng bị xoá, nếu nó trở nên rỗng. Chú ý rằng, tại điểm
này, một số bucket có thể được kết hợp lại và kích cỡ của bảng địa chỉ bucket sẽ
giảm đi một nửa.
Ưu điểm chính của băm có thể mở rộng là hiệu năng không bị suy giảm khi file
tăng kích cỡ, hơn nữa, tổng phí không gian là tối tiểu mặc dù phải thêm vào không
gian cho bảng địa chỉ bucket. Một khuyết điểm của băm có thể mở rộng là việc tìm
kiếm phải bao hàm một mức gián tiếp: ta phải truy xuất bảng địa chỉ bucket trước khi
truy xuất đến bucket. Vì vậy, băm có thể mở rộng là một kỹ thuật rất hấp dẫn.
3.11. Chọn chỉ mục hay băm
Ta đã xét qua các sơ đồ: chỉ mục thứ tự, băm. Ta có thể tổ chức file các mẩu tin
bởi hoặc sử dụng tổ chức file tuần tự chỉ mục, hoặc sử dụng B+-cây, hoặc sử dụng
băm ... Mỗi sơ đồ có những các ưu điểm trong các tình huống nhất định. Một nhà thực
thi hệ CSDL có thể cung cấp nhiều nhiều sơ đồ, để lại việc quyết định sử dụng sơ đồ
nào cho nhà thiết kế CSDL. Để có một sự lựa chọn khôn ngoan, nhà thực thi hoặc nhà
thiết kế CSDL phải xét các yếu tố sau:
-Cái giá phải trả cho việc tổ chức lại theo định kỳ của chỉ mục hoặc băm có
chấp nhận được hay không?
-Tần số tương đối của các hoạt động chèn và xoá là bao nhiêu ?
71
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
-Có nên tối ưu hoá thời gian truy xuất trung bình trong khi thời gian truy xuất
trường hợp xấu nhất tăng lên hay không ?
-Các kiểu vấn tin mà các người sử dụng thích đặt ra là gì ?
3.12. Cấu trúc lưu trữ cho CSDL hướng đối tượng
3.12.1. Sắp xếp các đối tượng vào file
Phần dữ liệu của đối tượng có thể được lưu trữ bởi sử dụng các cấu trúc file
được mô tả trước đây với một số thay đổi do đối tượng có kích cỡ không đều, hơn nữa
đối tượng có thể rất lớn. Ta có thể thực thi các trường tập hợp ít phần tử bằng cách sử
dụng danh sách liên kết, các trường tập hợp nhiều phần tử bởi B-cây hoặc bởi các quan
hệ riêng biệt trong cơ sở dữ liệu. Các trường tập hợp cũng có thể bị loại trừ ở mức lưu
trữ bởi chuẩn hoá. Các đối tượng cực lớn khó có thể phân tích thành các thành phần
nhỏ hơn có thể được lưu trữ trong một file riêng cho mỗi đối tượng.
3.12.2. Thực thi định danh đối tượng
Vì đối tượng được nhận biết bởi định danh của đối tượng (OID = objject
Identifier), Một hệ lưu trữ đối tượng cần phải có một cơ chế để tìm kiếm một đối
tượng được cho bởi một OID. Nếu các OID là logic, có nghĩa là chúng không xác định
vị trí của dối tượng, hệ thống lưu trữ phải duy trì một chỉ mục mà nó ánh xạ OID tới vị
trí hiện hành của đối tượng. Nếu các OID là vật lý, có nghĩa là chúng mã hoá vị trí của
đối tượng, đối tượng có thể dược tìm trực tiếp. Các OID điển hình có ba trường sau:
1. Một volume hoặc định danh file
2. Một định danh trang bên trong volume hoặc file
3. Một offset bên trong trang
Hơn nữa, OID vật lý có thẻ chứa một định danh duy nhất, nó là một số nguyên
tách biệt OID với các định danh của các đối tượng khác đã được lưu trữ ở cùng vị trí
trước đây và đã bị xoá hoặc dời đi. Định danh duy nhất này cũng được lưu với đối
tượng, các định danh trong một OID và đối tượng tương ứng phù hợp. Nếu định danh
duy nhất trong một OID vật lý không khớp với với định danh duy nhất trong đối tượng
mà OID này trỏ tới, hệ thống phát hiện ra rằng con trỏ là bám và báo một lỗi. Lỗi con
trỏ như vậy xảy ra khi OID vật lý tương ứng với đối tượng cũ đã bị xoá do tai nạn.
Nếu không gian bị chiếm bởi đối tượng được cấp phát lại, có thể có một đối tượng mới
72
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
ở vào vị trí này và có thể được định địa chỉ không đúng bởi định danh của đối tượng
cũ. Nếu không phát hiện được, sử dụng con trỏ bám có thể gây nên sự sai lạc của một
đối tượng mới được lưu ở cùng vị trí. Định danh duy nhất trợ giúp phát hiện lỗi như
vậy. Giả sử một đối tượng phải di chuyển sang trang mới do sự lớn lên của đối tượng
và trang cũ không có không gian phụ. Khi đó OID vật lý trỏ tới trang cũ bây giờ không
còn chứa đối tượng. Thay vì thay đổi OID của đối tượng (điều này kéo theo sự thay
đổi mỗi đối tượng trỏ tới đối tượng này) ta để địa chỉ forward ở vị trí cũ. Khi CSDL
tìm đối tượng, nó tìm địa chỉ forward thay cho tìm đối tượng và sử dụng địa chỉ
forward để tìm đối tượng.
3.13. Quản trị các con trỏ bền
Ta thực thi các con trỏ bền trong ngôn ngữ lập trình bền (persistent
programming language) bằng cách sử dụng các OID. Các con trỏ bền có thể là các
OID vật lý hoặc logic. Sự khác nhau quan trọng giữa con trỏ bền và con trỏ trong bộ
nhớ là kích thước concủa con trỏ. Con trỏ trong bộ nhớ chỉ cần đủ lớn để định địa chỉ
toàn bộ bộ nhớ ảo, hiện tại kích cỡ con trỏ trong bộ nhớ là 4 byte. Con trỏ bền để định
địa chỉ toàn bộ dữ liệu trong một CSDL, nên kích cỡ của nó ít nhất là 8 byte.
Pointer Swizzling
Hành động tìm một đối tượng được cho bởi định danh được gọi là
dereferencing. Đã cho một con trỏ trong bộ nhớ, tìm đối tượng đơn thuần là một sự
tham khảo bộ nhớ. Đã cho một con trỏ bền, dereferencing một đối tượng có một bước
phụ: phải tìm vị trí hiện hành của đối tượng trong bộ nhớ bởi tìm con trỏ bền trong một
bảng. Nếu đối tượng chưa nằm trong bộ nhớ, nó phải được nạp từ đĩa. Ta có thể thực
thi bảng tìm kiếm này hoàn toàn hiệu quả bởi sử dụng băm, song tìm kiếm vẫn chậm.
Pointer swizling là một phương pháp để giảm cái giá tìm kiếm các đối tượng bền đã
hiện diện trong bộ nhớ. ý tưởng là khi một con trỏ bền được dereference, đối tượng
được định vị và mang vào trong bộ (nhớ nếu nó chưa có ở đó). Bây giờ một bước phụ
được thực hiện: một con trỏ trong bộ nhớ tới đối tượng được lưu vào vị trí của con trỏ
bền. Lần kế con trỏ bền tương tự được dereference, vị trí trong bộ nhớ có thể được đọc
ra trực tiếp. Trong trường hợp các đối tượng bền phải di chuyển lên đĩa để lấy không
gian cho đối tượng bền khác, cần một bước phụ để đảm bảo đối tượng vẫn trong bộ
nhớ cũng phải được thực hiện. Khi một đối tượng được viết ra. bất kỳ con trỏ bền nào
73
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
mà nó chứa và bị swizzling phải được unswizzling như vậy được chuyển đổi về biểu
diễn bền của chúng. pointer swizzling trên poiter dereferenc được mô tả này được gọi
là software swizzling. Quan trị buffer sẽ phức tạp hơn nếu pointer swizzling được sử
dụng.
Hardware swizzling
Việc có hai kiểu con trỏ, con trỏ bền (persistent pointer) và con trỏ tạm
(transient pointer / con trỏ trong bộ nhớ), là điều khá bất lợi. Người lập trình phải nhớ
kiểu con trỏ và có thể phải viết mã chương trình hai lần- một cho các con trỏ bền và
một cho con trỏ tạm. Sẽ thuận tiên hơn nếu cả hai kiểu con trỏ này cùng kiẻu. Một
cách đơn giản để trộn lãn hai con rỏ này là mở rộng chiều dài con trỏ bộ nhớ cho bằng
kích cỡ con trỏ bền và sử dụng một bit của phần định danh để phân biệt chúng. Cách
làm này sẽ làm tăng chi phí lưu trữ đối với các con trỏ tạm. Ta sẽ mô tả một kỹ thuật
được gọi là hardware swizzling nó sử dụng phần cứng quản trị bộ nhớ để giải quyết
vấn đề này. Hardware swizzling có hai điểm lợi hơn so với software swizzling: Thứ
nhất, nó cho phép lưu trữ các con trỏ bền trong đối tượng trong lượng không gian bằng
với lượng không gian con trỏ bộ nhớ đòi hỏi. Thứ hai, nó chuyển đổi trong suốt giữa
các con trỏ bền và các con trỏ tạm một cách thông minh và hiệu quả. Phần mềm được
viết để giải quyết các con trỏ trong bộ nhớ có thể giải quyết các con trỏ bền mà không
cần thay đổi. Hardware swizzling sử dụng sự biểu diễn các con trỏ bền được chứa
trong đối tượng trên đĩa như sau: Một con trỏ bền được tách ra thành hai phần, một là
định danh trang và một là offset bên trong trang. Định danh trang thường là một con
trỏ trực tiếp nhỏ: mỗi trưng có một bảng dịch (translation table) cung cấp một ánh xạ
từ các định danh trang ngắn đến các định danh CSDL đầy đủ. Hệ thống phải tìm định
danh trang nhỏ trong một con trỏ bền trong bảng dịch để tìm định danh trang đầy đủ.
Bảng dịch, trong trường hợp xấu nhất, chỉ lớn bằng số tối đa các con trỏ có thể được
chứa trong các đối tượng trong một trang. Với một trang kích thước 4096 byte, con trỏ
kích thước 4 byte, số tối đa các con trỏ là 1024. Trong thực tế số tối đa nhỏ hơn con số
này rất nhiều. Định danh trang nhỏ chỉ cần đủ số bit để định danh một dòng trong
bảng, nếu số dòng tối đa là 1024, chỉ cần 10 bit để định danh trang nhỏ. Bảng dịch cho
phép toàn bộ một con trỏ bền lấp đầy một không gian bằng không gian cho một con trỏ
trong bộ nhớ.
74
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Trong hình 1, trình bày sơ đồ biểu diễn con trỏ bền, có ba đối tượng trong trang,
mỗi một chứa một con trỏ bền. Bảng dịch cho ra ánh xạ giữa định danh trang ngắn và
định danh trang CSDL đầy đủ đối với mỗi định danh trang ngắn trong các con trỏ bền
này. Định danh trang CSDL được trình bày dưới dạng volume.file.offset. Thông tin
phụ được duy trì với mỗi trang sao cho tất cảc các con trỏ bền trong trang có thể tìm
thấy. Thông tin được cập nhất khi một đối tượng được tạo ra hay bị xoá khỏi trang.
Khi một con trỏ trong bộ nhớ được dereferencing, nếu hệ điều hành phát hiện trang
trong không gian địa chỉ ảo được trỏ tới không được cấp phát lưu trữ hoặc có truy xuất
được bảo vệ, khi đó một sự vi phạm đoạn được ước đoán là xảy ra. Nhiều hệ điều hành
cung cấp một cơ chế xác định một hàm sưe được gọi khi vi phạm đoạn xảy ra, một cơ
chế cấp phát lưu trữ cho các trang trong không gian địa chỉ ảo, và một tập các quyền
truy xuất trang. Đầu tiên, ta xét một con trỏ trong bộ nhớ trỏ tới trang v được khử tham
chiếu, khi lưu trữ chưa được cấp phát cho trang này. Một vi phạm đoạn sẽ xảy ra và
kết quả là một lời gọi hàm trên hệ CSDL. Hệ CSDL dầu tiên xác định trang CSDL nào
đã được cấp phát cho trang bộ nhớ ảo v, gọi định danh trang đầy đủ của trang CSDL là
P, nếu không có trang CSDL cấp phát cho v, một lỗi được thông báo., nếu không, hệ
CSDL cấp phát không gian lưu trữ cho trang v và nạp trang CSDL P vào trong v.
Pointer swizzling bây giờ được làm đối với trang P như sau: Hệ thông tìm tất cả các
con trỏ bèn được chứa trong các đối tương trong trang, bằng cách sử dụng thông tin
phụ được lưu trữ trong trang. Ta xét một con trỏ như vậy và gọi nó là (pi, oi), trong đó
75
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
pi là định danh trang ngắn và oi là offset trong trang. Giả sử Pi là định danh trang đầy
đủ của pi được tìm thấy trong bảng dịch trong trang P. Nếu trang Pi chưa có một trang
bộ nhớ ảo được cấp cho nó, một trang tự do trong không gian địa chỉ ảo sẽ được cấp
cho nó. Trang Pi sẽ nằm ở vị trí địa chỉ ảo nàynếu và khi nó được mang vào. Tại điểm
này, trang trong không gian địa chỉ ảo không có bất kỳ một lưu trữ nào được cấp cho
nó, cả trong bộ nhớ lẫn trên đĩa, đơn tuần chỉ là một khoảng địa chỉ dự trữ cho trang
CSDL. Bây giờ giả sử trang bộ nhớ ảo đã được cấp phát cho Pi là vi . Ta cập nhật con
trỏ (pi, oi) bởi thay thế pi bởi vi , cuối cùng sau khi swizzling tất cả các con trỏ bền
trong P, sự khử tham chiếu gây ra vi phạm đoạn được cho phép tiếp tục và sẽ tìm thấy
đối tượng đang được tìm kiếm trong bộ nhớ.
Trong hình 2, trình bày trạng thái trang trong hình 1 sau khi trang này được
mang vào trong bộ nhớ và các con trỏ trong nó đã được swizzling. ở đây ta giả thiết
trang định danh trang CSDL của nó là 679.34.28000 được ánh xạ đến trang 5001 trong
bộ nhớ, trong khi trang định danh của nó là 519.56.84000 được ánh xạ dến trang 4867.
Tất cả các con trỏ trong đối tượng đã được cập nhật để phản ánh tương ứng mới và bây
giờ có thể được dùng như con trỏ trong bộ nhớ. ở cuối của giai đoạn dịch đói với một
trang, các đối tượng trong trang thoả mãn một tính chất quan trọng: Tất cả các con trỏ
bền được chứa trong đối tượng trong trang được chuyển đổi thành các con trỏ trong bộ
nhớ.
76
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Câu hỏi
1. Nêu tóm tắc các đặc trưng của các phương tiện lưu trữ vật lý
2. Xét sự sắp xếp các khối dữ liệu và các khối parity trên bốn đĩa sau:
Trong đó các Bi biểu diễn các khối dữ liệu, các khối Pi biểu diễn các khối
parity. Khối Pi là khối parity đối với các khối dữ liệu B4i - 3 , B4i - 2 , B4i - 1 , B4i .
Hãy nêu các vấn đề gặp phải của cách sắp xếp này.
3. Một sự mất điện xảy ra trong khi một khối đang được viết sẽ dẫn tới kết quả là khối
đó có thể chỉ được viết một phần. Giả sử rằng khối được viết một phần có thể phát
hiện được. Một viết khối nguyên tử là hoặc toàn bộ khối được viết hoặc không có gì
được viết ( không có khối được viết một phần ). Hãy đề nghị những sơ đồ để có được
các viết khối nguyên tử hiệu quả trên các sơ đồ RAID.
4. Các hệ thống RAID tiêu biểu cho phép thay thế các đĩa hư không cần ngưng truy
xuất hệ thống. Như vậy dữ liệu trong đĩa bị hư sẽ phải được tái tạo và viết lên đĩa thay
thế trong khi hệ thống vẫn tiếp tục hoạt động. Với mức RAID nào thời lượng giao
thoa giữa việc tái tạo và các truy xuất đĩa còn đang chạy là ít nhất ? Giải thích.
5. Xét việc xoá mẩu tin 5 trong file:
77
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
So sánh các điều hay/dở tương đối của các kỹ thuật xoá sau:
1. Di chuyển mẩu tin 6 đến không gian chị chiếm bởi mẩu tin 5, rồi di chuyển
mẩu tin 7 đến chỗ bị chiếm bởi mẩu tin 6.
2. Di chuyển mẩu tin 7 đến chỗ bị chiếm bởi mẩu tin 5
3. Đánh dấu xoá mẩu tin 5.
6. Vẽ cấu trúc của file:
Sau mỗi bước sau:
1. Insert( Brighton, A-323, 1600 )
2. Xoá mẩu tin 2
3. Insert( Brighton, A-636, 2500 )
7. Vẽ lại cấu trúc file:
Sau mỗi bước sau:
1. Insert( Mianus, A-101, 2800 )
78
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
2. Insert( Brighton, A-323, 1600 )
3. Delete ( Perryridge, A-102, 400 )
8. Vẽ lại cấu trúc file dưới đây sau mỗi bước sau:
1. Insert( Mianus, A-101, 2800
2. Insert( Brighton, A-323, 1600 )
3. Delete ( Perryridge, A-102, 400 )
9. Nếu một khối trở nên rỗng sau khi xoá. Khối này được tái sử dụng vào mục đích gì
?
10. Trong tổ chức file tuần tự, tại sao khối tràn được sử dụng thậm chí, tại thời điểm
đang xét, chỉ có một mẩu tin tràn ?
11. Khi nào sử dụng chỉ mục đặc phù hợp hơn chỉ mục thưa ? Giải thích.
12. Nêu các điểm khác nhau giữa chỉ mục sơ cấp và chỉ mục thứ cấp .
13. Xây dựng một B+-cây đối với tập các giá trị khoá: ( 2, 3, 5, 7, 11, 15, 19, 25, 29,
33, 37, 41, 47 ). Giả thiết ban đầu cây là rỗng và các giá trị được xen theo thứ tự tăng.
Xét trong các trường hợp sau:
1. Mỗi nút chứa tối đa 4 con trỏ
2. Mỗi nút chứa tối đa 6 con trỏ
79
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
14. Đối với mỗi B+-cây trong bài tập 13 ở trên, hãy bày tỏ các bước thực hiện trong
các vấn tin sau:
1. Tìm mẩu tin với giá trị khoá tìm kiếm 11
2. Tìm các mẩu tin với giá trị khoá nằm trong khoảng [ 7..19 ]
15. Đối với mỗi B+-cây trong bài tập13. Vẽ cây sau mỗi một trong dãy hoạt động sau:
1. Insert 9
2. Insert 11
3. Insert 11
4. Delete 25
5. Delete 19
16. Xây dựng một B-cây đối với tập các giá trị khoá: ( 2, 3, 5, 7, 11, 15, 19, 25, 29,
33, 37, 41, 47 ). Giả thiết ban đầu cây là rỗng và các giá trị được xen theo thứ tự tăng.
Xét trong các trường hợp sau:
1. Mỗi nút chứa tối đa 4 con trỏ
2. Mỗi nút chứa tối đa 6 con trỏ
17. Nêu và giải thích sự khác nhau giữa băm đóng và băm mở. Nêu các ưu, nhược
điểm của mỗi kỹ thuật này.
18. Điều gì gây ra sự tràn bucket trong một tổ chức file băm ? Làm gì để giảm sự tràn
này ?
19. Giả sử ta đang sử dụng băm có thể mở rộng trên một trên một file chứa các mẩu
tin với các giá trị khoá tìm kiếm sau:
2, 3, 5, 7, 11, 17, 19, 23, 37, 31, 35, 41, 49, 55
Vẽ cấu trúc băm có thể mở rộng đối với file này nếu hàm băm là h( x ) = x
mod 8 và mỗi bucket có thể chứa nhiều nhất được ba mẩu tin.
20. Vẽ lại cấu trúc băm có thể mở rộng trong bài tập 19 sau mỗi bước sau:
1. Xoá 11
2. Xoá 55
3. Xen 1
80
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Chương 4
GIAO DỊCH
4.1. Khái niệm
Một giao dịch là một đơn vị thực hiện chương trình truy xuất và có thể cập nhật
nhiều hạng mục dữ liệu. Một giao dịch thường là kết quả của sự thực hiện một chương
trình người dùng được viết trong một ngôn ngữ thao tác dữ liệu mức cao hoặc một
ngôn ngữ lập trình (SQL, COBOL, PASCAL ...), và được phân cách bởi các câu lệnh
(hoặc các lời gọi hàm) có dạng begin transaction và end transaction. Giao dịch bao
gồm tất cả các hoạt động được thực hiện giữa begin và end transaction.
Để đảm bảo tính toàn vẹn của dữ liệu, ta yêu cầu hệ CSDL duy trì các tính chất
sau của giao dịch:
Tính nguyên tử (Atomicity). Hoặc toàn bộ các hoạt động của giao dịch được
phản ánh đúng đắn trong CSDL hoặc không có gì cả.
Tính nhất quán (consistency). Sự thực hiện của một giao dịch là cô lập
(Không có giao dịch khác thực hiện đồng thời) để bảo tồn tính nhất quán của CSDL.
Tính cô lập (Isolation). Cho dù nhiều giao dịch có thể thực hiện đồng thời, hệ
thống phải đảm bảo rằng đối với mỗi cặp giao dịch Ti, Tj , hoặc Tj kết thúc thực hiện
trước khi Ti khởi động hoặc Tj bắt đầu sự thực hiện sau khi Ti kết thúc. Như vậy mỗi
giao dịch không cần biết đến các giao dịch khác đang thực hiện đồng thời trong hệ
thống.
Tính bền vững (Durability). Sau một giao dịch hoàn thành thành công, các
thay đổi đã được tạo ra đối với CSDL vẫn còn ngay cả khi xảy ra sự cố hệ thống.
Các tính chất này thường được gọi là các tính chất ACID (Các chữ cái đầu của
bốn tính chất). Ta xét một ví dụ: Một hệ thống nhà băng gồm một số tài khoản và một
tập các giao dịch truy xuất và cập nhật các tài khoản. Tại thời điểm hiện tại, ta giả thiết
rằng CSDL nằm trên đĩa, nhưng một vài phần của nó đang nằm tạm thời trong bộ nhớ.
Các truy xuất CSDL được thực hiện bởi hai hoạt động sau:
• READ(X): chuyển hạng mục dữ liệu X te CSDL đến buffer của giao dịch thực
81
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
hiện hoạt động READ này.
• WRITE(X): chuyển hạng mục dữ liệu X te buffer của giao dịch thực hiện
WRITE đến CSDL.
Trong hệ CSDL thực, hoạt động WRITE không nhất thiết dẫn đến sự cập nhật
trực tiếp dữ liệu trên đĩa; hoạt động WRITE có thể được lưu tạm thời trong bộ nhớ và
được thực hiện trên đĩa muộn hơn. Trong ví dụ, ta giả thiết hoạt động WRITE cập
nhật trực tiếp CSDL.
Ti là một giao dịch chuyển 50 te tài khoản A sang tài khoản B. Giao dịch này
có thể được xác định như sau:
Ti : READ(A);
A:=A - 50;
WRITE(A)
READ(B);
B:=B + 50;
WRITE(B);
Ta xem xét mỗi một trong các yêu cầu ACID
Tính nhất quán: Đòi hmi nhất quán ở đây là tổng của A và B là không thay đổi
bởi sự thực hiện giao dịch. Nếu không có yêu cầu nhất quán, tiền có thể được tạo ra
hay bị phá hun bởi giao dịch. Do dàng kiểm nghiệm rằng nếu CSDL nhất quán trước
một thực hiện giao dịch, nó vẫn nhất quán sau khi thực hiện giao dịch. Đảm bảo tính
nhất quán cho một giao dịch là trách nhiệm của người lập trình ứng dụng người đã viết
ra giao dịch. Nhiệm vụ này có thể được làm cho do dàng bởi kiểm thp tự động các
ràng buộc toàn vẹn.
Tính nguyên tử: Giả sp rằng ngay trước khi thực hiện giao dịch Ti, giá trị của
các tài khoản A và B tương ứng là 1000 và 2000. Giả sp rằng trong khi thực hiện giao
dịch Ti, một sự cố xảy ra cản trở Ti hoàn tất thành công sự thực hiện của nó. Ta cũng
giả sp rằng sự cố xảy ra sau khi hoạt động WRITE(A) đã được thực hiện, nhưng trước
khi hoạt động WRITE(B) được thực hiện. Trong trường hợp này giá trị của tài khoản
A và B là 950 và 2000. Ta đã phá hun 50$. Tổng A+B không còn được bảo tồn. Như
vậy, kết quả của sự cố là trạng thái của hệ thống không còn phản ánh trạng thái của thế
giới mà CSDL được giả thiết nắm giữ. Ta su gọi trạng thái như vậy là trạng thái không
82
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
nhất quán. Ta phải đảm bảo rằng tính bất nhất này không xuất hiện trong một hệ
CSDL. Chú ý rằng, cho dù thế nào tại một vài thời điểm, hệ thống cũng phải ở trong
trạng thái không nhất quán. Ngay cả khi giao dịch Ti , trong quá trình thực hiện cũng
tồn tại thời điểm tại đó giá trị của tài khoản A là 950 và tài khoản B là 2000 - một
trạng thái không nhất quán. Trạng thái này được thay thế bởi trạng thái nhất quán khi
giao dịch đã hoàn tất. Như vậy, nếu giao dịch không bao giờ khởi động hoặc được
đảm bảo su hoàn tất, trạng thái không nhất quán su không bao giờ xảy ra. Đó chính là
lý do có yêu cầu về tính nguyên tp: Nếu tính chất nguyên tp
được cung cấp, tất cả các hành động của giao dịch được phản ánh trong CSDL hoặc
không có gì cả. ý tưởng cơ sở để đảm bảo tính nguyên tp là như sau: hệ CSDL lưu vết
(trên đĩa) các giá trị cũ của bất kỳ dữ liệu nào trên đó giao dịch đang
thực hiện viết, nếu giao dịch không hoàn tất, giá trị cũ được khôi phục để đặt trạng
thái của hệ thống trở lại trạng thái trước khi giao dịch dion ra. Đảm bảo tính nguyên tp
là trách nhiệm của hệ CSDL, và được quản lý bởi một thành phần được gọi là
thành phần quản trị giao dịch (transaction-management component).
Tính bền vững: Tính chất bền vững đảm bảo rằng mỗi khi một giao dịch hoàn
tất, tất cả các cập nhật đã thực hiện trên cơ sở dữ liệu vẫn còn đó, ngay cả khi xảy ra
sự có hệ thống sau khi giao dịch đã hoàn tất. Ta giả sp một sự cố hệ thống có thể gây
ra việc mất dữ liệu trong bộ nhớ chính, nhưng dữ liệu trên đĩa thì không mất. Có thể
đảm bảo tính bền vững bởi việc đảm bảo hoặc các cập nhật được thực hiện bởi giao
dịch đã được viết lên đĩa trước khi giao dịch kết thúc hoặc thông tin về sự cập nhật
được thực hiện bởi giao dịch và được viết lên đĩa đủ cho phép CSDL xây dựng lại các
cập nhật khi hệ CSDL được khởi động lại sau sự cố. Đảm bảo tính bền vững là trách
nhiệm của một thành phần của hệ CSDL được gọi là thành phần quản trị phục hồi
(recovery management component). Hai thành phần quản trị giao dịch và quản trị phục
hồi quan hệ mật thiết với nhau.
Tính cô lập: Ngay cả khi tính nhất quán và tính nguyên tp được đảm bảo cho
mỗi giao dịch, trạng thái không nhất quán vẫn có thể xảy ra nếu trong hệ thống có một
số giao dịch được thực hiện đồng thời và các hoạt động của chúng đan xen theo một
cách không mong muốn. Ví dụ, CSDL là không nhất quán tạm thời trong khi giao dịch
chuyển khoản te A sang B đang thực hiện, nếu một giao dịch khác thực hiện đồng thời
đọc A và B tại thời điểm trung gian nàyvà tính A+B, nó đã tham khảo một giá trị
83
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
không nhất quán, sau đó nó thực hiện cập nhật A và B dựa trên các giá trị không nhất
quán này, như vậy CSDL có thể ở trạng thái không nhất quán ngay cả khi cả hai giao
dịch hoàn tất thành công. Một giải pháp cho vấn đề các giao dịch thực hiện đồng thời
là thực hiện tuần tự các giao dịch, tuy nhiên giải pháp này làm giả hiệu năng của hệ
thống. Các giải pháp khác cho phép nhiều giao dịch thực hiện cạnh tranh đã được phát
triển ta su thảo luận về chúng sau này. Tính cô lập của một giao dịch đảm bảo rằng sự
thực hiện đồng thời các giao dịch dẫn đến một trạng thái hệ thống tương đương với
một trạng thái có thể nhận được bởi thực hiện các giao dịch này một tại một thời điểm
theo một thứ nào đó. Đảm bảo tính cô lập là trách nhiệm của một thành phần của hệ
CSDL được gọi là thành phần quản trị cạnh tranh (concurrency-control component).
4.2. Trạng thái giao dịch
Nếu không có sự cố, tất cả các giao dịch đều hoàn tất thành công. Tuy nhiên,
một giao dịch trong thực tế có thể không thể hoàn tất sự thực hiện của nó. Giao dịch
như vậy được gọi là bị bm dở. Nếu ta đảm bảo được tính nguyên tp, một giao dịch bị
bm dở không được phép làm ảnh hưởng tới trạng thái của CSDL. Như vậy, bất kỳ thay
đổi nào mà giao dịch bị bm dở này phải bị hun bm. Mỗi khi các thay đổi do giao dịch bị
bm dở bị hun bm, ta nói rằng giao dịch bị cuộn lại (rolled back). Việc này là trách
nhiệm của sơ đồ khôi phục nhằm quản trị các giao dịch bị bm dở. Một giao dịch hoàn
tất thành công sự thực hiện của nó được gọi là được bàn giao
(committed). Một giao dịch được bàn giao (committed), thực hiện các cập nhật su biến
đổi CSDL sang một trạng thái nhất quán mới và nó là bền vững ngay cả khi có sự cố.
Mỗi khi một giao dịch là được bàn giao (committed), ta không thể hun bm các hiệu quả
của nó bằng các bm dở nó. Cách duy nhất để hun bm các hiệu quả của một giao dịch
được bàn giao (committed) là thực hiện một giao dịch bù (compensating transaction);
nhưng không phải luôn luôn có thể tạo ra một giao dịch bù. Do vậy trách nhiệm viết
và thực hiện một giao dịch bù thuộc về người sp dụng và không được quản lý bởi hệ
CSDL.
Một giao dịch phải ở trong một trong các trạng thái sau:
Hoạt động (Active). Trạng thái khởi đầu; giao dịch giữ trong trạng thái này
trong khi nó đang thực hiện, được bàn giao bộ phận (Partially Committed). Sau khi
lệnh cuối cùng được thực hiện.
84
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Thất bại (Failed). Sau khi phát hiện rằng sự thực hiện không thể tiếp tục
được nữa.
Bỏ dở (Aborted). Sau khi giao dịch đã bị cuộn lại và CSDL đã phục hồi lại
trạng thái của nó trước khi khởi động giao dịch.
Được bàn giao (Committed). Sau khi hoàn thành thành công giao dịch. Ta nói
một giao dịch đã được bàn giao (committed) ch{ nếu nó đã di vào trạng thái
Committed, tương tự, một giao dịch bị bm dở nếu nó đã đi vào trạng thái Aborted. Một
giao dịch được gọi là kết thúc nếu nó hoặc là committed hoặc là Aborted. Một giao
dịch khởi đầu bởi trạng thái Active. Khi nó kết thúc lệnh sau cùng của nó, nó chuyển
sang trạng thái partially committed. Tại thời điểm này, giao dịch đã hoàn thành sự
thực hiện của nó, nhưng nó vẫn có thể bị bm dở do đầu ra hiện tại vẫn có thể trú tạm
thời trong bộ nhớ chính và như thế một sự cố phần cứng vẫn có thể ngăn cản sự hoàn
tất của giao dịch. Hệ CSDL khi đó đã kịp viết lên đĩa đầy đủ thông tin giúp việc tái tạo
các cập nhật đã được thực hiện trong quá trình thực hiện giao dịch, khi hệ thống tái
khởi động sau sự cố. Sau khi các thông tin sau cùng này được viết lên đĩa, giao dịch
chuyển sang trạng thái committed. Biểu đồ trạng thái tương ứng với một giao dịch như
sau:
Với giả thiết sự cố hệ thống không gây ra sự mất dữ liệu trên đĩa, Một giao dịch
đi vào trạng thái Failed sau khi hệ thống xác định rằng giao dịch không thể tiến triển
bình thường được nữa (do lỗi phần cứng hoặc phần mềm). Như vậy, giao dịch phải
được cuộn lại rồi chuyển sang trạng thái bm dở. Tại điểm này, hệ thống có hai lựa
chọn:
85
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Khởi động lại giao dịch, nhưng ch{ nếu giao dịch bị bở dở là do lỗi phần cứng
hoặc phần mềm nào đó không liên quan đến logic bên trong của giao dịch. Giao dịch
được khởi động lại được xem là một giao dịch mới.
Giết giao dịch thường được tiến hành hoặc do lỗi logic bên trong giao dịch, lỗi
này cần được ch{nh spa bởi viết lại chương trình ứng dụng hoặc do đầu vào xấu hoặc
do dữ liệu mong muốn không tìm thấy trong CSDL.
Ta phải thận trọng khi thực hiện viết ngoài khả quan sát (observable external
Write - như viết ra terminal hay máy in). Mỗi khi một viết như vậy x~y ra, nó không
thể bị xoá do nó có thể phải giao tiếp với bên ngoài hệ CSDL. Hầu hết các hệ thống
cho phép các viết như thế x~y ra ch{ khi giao dịch đã di vào trạng thái committed. Một
cách để thực thi một sơ đồ như vậy là cho hệ CSDL lưu trữ tạm thời bất kỳ giá trị nào
kết hợp với các viết ngoài như vậy trong lưu trữ không hay thay đổi và thực hiện các
viết hiện tại ch{ sau khi giao dịch đã đi vào trạng thái committed. Nếu hệ thống thất
bại sau khi giao dịch đi vào trạng thái committed nhưng trước khi hoàn tất các viết
ngoài, hệ CSDL su làm các viết ngoài này (sp dụng dữ liệu trong lưu trữ không hay
thay đổi) khi hệ thống khởi động lại.
Trong một số ứng dụng, có thể muốn cho phép giao dịch hoạt động trình bày dữ
liệu cho người sp dụng, đặc biệt là các giao dịch kéo dài trong vài phút hay vài giờ. Ta
không thể cho phép xuất ra dữ liệu khả quan sát như vậy tre phi ta buộc phải làm tổn
hại tính nguyên tp giao dịch. Hầu hết các hệ thống giao dịch hiện hành đảm bảo tính
nguyên tp và do vậy cấm dạng trao đổi với người dùng này.
4.3. Thực thi tính nguyên tử và tính bền vững
Thành phần quản trị phục hồi của một hệ CSDL hỗ trợ tính nguyên tp và tính
bền vững. Trước tiên ta xét một sơ đồ đơn giản (song cực kỳ thiếu hiệu quả). Sơ đồ
này giả thiết rằng ch{ một giao dịch là hoạt động tại một thời điểm và được dựa trên
tạo bản sao của CSDL được gọi là các bản sao bóng (shadow copies). Sơ đồ giả thiết
rằng CSDL ch{ là một file trên đĩa. Một con trm được gọi là db_pointer được duy trì
trên đĩa; nó trm tới bản sao hiện hành của CSDL.
Trong sơ đồ CSDL bóng (shadow-database), một giao dịch muốn cập nhật
CSDL, đầu tiên tạo ra một bản sao đầy đủ của CSDL. Tất cả các cập nhật được làm
trên bản sao này, không đụng chạm tới bản gốc (bản sao bóng). Nếu tại một thời điểm
86
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
bất kỳ giao dịch bị bm dở, bản sao mới bị xoá. Bản sao cũ của CSDL không bị ảnh
hưởng. Nếu giao dịch hoàn tất, nó được được bàn giao (committed) như sau. Đầu tiên,
Hmi hệ điều hành để đảm bảo rằng tất cả các trang của bản sao mới đã được viết lên
đĩa (flush). Sau khi flush con trm db_pointer được cập nhật để trm đến bản sao mới; bản
sao mới trở thành bản sao hiện hành của CSDL. Bản sao cũ bị xoá đi. Giao dịch được
gọi là đã được được bàn giao (committed) tại thời điểm sự cập nhật con trm db_pointer
được ghi lên đĩa. Ta xét k thuật này quản lý sự cố giao dịch và sự cố hệ thống ra sao?
Trước tiên, ta xét sự cố giao dịch. Nếu giao dịch thất bại tại thời điểm bất kỳ trước khi
con trm db_pointer được cập nhật, nội dung cũ của CSDL không bị ảnh hưởng. Ta có
thể bm dở giao dịch bởi xoá bản sao mới. Mỗi khi giao dịch được được bàn giao
(committed), tất cả các cập nhật mà nó đã thực hiện là ở trong CSDL được trm bởi
db_pointer. Như vậy, hoặc tất cả các cập nhật của giao dịch đã được phản ánh hoặc
không hiệu quả nào được phản ánh, bất chấp tới sự cố giao dịch. Bây giờ ta xét sự cố
hệ thống. Giả sp sự cố hệ thống xảy ra tại thời điểm bất kỳ trước khi db_pointer đã
được cập nhật được viết lên đĩa. Khi đó, khi hệ thống khởi động lại, nó su đọc
db_pointer và như vậy su thấy nội dung gốc của CSDL - không hiệu quả nào của giao
dịch được nhìn thấy trên CSDL. Bây giờ lại giả sp rằng sự cố hệ thống xảy ra sau khi
db_pointer đã được cập nhật lên đĩa. Trước khi con trm được cập nhật, tất cả các trang
được cập nhật của bản sao mới đã được viết lên đĩa. Te giả thiết file trên đĩa không bị
hư hại do sự cố hệ thống. Do vậy, khi hệ thống khởi động lại, nó su đọc db_pointer và
su thấy nội dung của CSDL sau tất cả các cập nhật đã thực hiện bởi giao dịch. Sự thực
thi này phụ thuộc vào việc viết lên db_pointer, việc viết này phải là nguyên tp, có
nghĩa là hoặc tất cả các byte của nó được viết hoặc không byte nào được viết. Nếu ch{
một số byte của con trm được cập nhật bởi việc viết nhưng các byte khác thì không thì
con trm trở thành vô nghĩa và cả bản cũ lẫn bản mới của CSDL có thể tìm thấy khi hệ
thống khởi động lại. May mắn thay, hệ thống đĩa cung cấp các cập nhật nguyên tp toàn
bộ khối đĩa hoặc ít nhất là một sector đĩa. Như vậy hệ thống đĩa đảm bảo việc cập nhật
con trm db_pointer là nguyên tp. Tính nguyên tp và tính bền vững của giao dịch được
đảm bảo bởi việc thực thi bản sao bóng của thành phần quản trị phục hồi. Sự thực thi
này cực kỳ thiếu hiệu quả trong ngữ cảnh CSDL lớn, do sự thực hiện một giao dịch
đòi hmi phải sao toàn bộ CSDL. Hơn nữa sự thực thi này không cho phép các giao dịch
thực hiện đồng thời với các giao dịch khác. Phương pháp thực thi tính nguyên tp và
tính lâu bền mạnh hơn và đ tốn kém hơn được trình bày trong chương hệ thống phục
87
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
hồi.
4.4. Các thực hiện cạnh tranh
Hệ thống xp lý giao dịch thường cho phép nhiều giao dịch thực hiện đồng thời.
Việc cho phép nhiều giao dịch cập nhật dữ liệu đồng thời gây ra những khó khăn trong
việc bảo đảm sự nhất quán dữ liệu. Bảo đảm sự nhất quán dữ liệu mà không đếm x{a
tới sự thực hiện cạnh tranh các giao dịch su cần thêm các công việc phụ. Một phương
pháp do tiến hành là cho các giao dịch thực hiện tuần tự: đảm bảo rằng một giao dịch
khởi động ch{ sau khi giao dịch trước đã hoàn tất. Tuy nhiên có hai lý do hợp lý để
thực hiện cạnh tranh là:
Một giao dịch gồm nhiều bước. Một vài bước liên quan tới hoạt động I/O; các
bước khác liên quan đến hoạt động CPU. CPU và các đĩa trong một hệ thống có thể
hoạt động song song. Do vậy hoạt động I/O có thể được tiến hành song song với xp lý
tại CPU. Sự song song của hệ thống CPU và I/O có thể được khai thác để chạy nhiều
giao dịch song song. Trong khi một giao dịch tiến hành một hoạt động đọc/viết trên
một đĩa, một giao dịch khác có thể đang chạy trong CPU, một giao dịch thứ ba có thể
thực hiện đọc/viết trên một đĩa khác ... như vậy su tăng lượng đầu vào hệ thống có
nghĩa là tăng số lượng giao dịch có thể được thực hiện trong một lượng thời gian đã
cho, cũng có nghĩa là hiệu suất sp dụng bộ xp lý và đĩa tăng lên. Có thể có sự trộn lẫn
các giao dịch đang chạy trong hệ thống, cái thì dài cái thì ngắn.
Nếu thực hiện tuần tự, một quá trình ngắn có thể phải chờ một quá trình dài đến trước
hoàn tất, mà điều đó dẫn đến một sự trì hoãn không lường trước được trong việc chạy
một giao dịch. Nếu các giao dịch đang hoạt động trên các phần khác nhau của CSDL,
su tốt hơn nếu ta cho chúng chạy đồng thời, chia s các chu kỳ CPU và truy xuất đĩa
giữa chúng. Thực hiện cạnh tranh làm giảm sự trì hoãn không lường trước trong việc
chạy các giao dịch, đồng thời làm giảm thời gian đáp ứng trung bình: Thời gian để một
giao dịch được hoàn tất sau khi đã được đệ trình.
Động cơ để sp dụng thực hiện cạnh tranh trong CSDL cũng giống như động cơ
để thực hiện đa chương trong hệ điều hành. Khi một vài giao dịch chạy đồng thời, tính
nhất quán CSDL có thể bị phá hun cho dù mỗi giao dịch là đúng. Một giải pháp để
giải quyết vấn đề này là sp dụng định thời. Hệ CSDL phải điều khiển sự trao đổi giữa
các giao dịch cạnh tranh để ngăn ngea chúng phá hun sự nhất quán của CSDL. Các cơ
88
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
chế cho điều đó được gọi là sơ đồ điều khiển cạnh tranh (concurrency-control
scheme). Xét hệ thống nhà băng đơn giản, nó có một số tài khoản và có một tập hợp
các giao dịch, chúng truy xuất, cập nhật các tài khoản này. Giả sp T1 và T2 là hai giao
dịch chuyển khoản te một tài khoản sang một tài khoản khác. Giao dịch T1 chuyển 50
$ te tài khoản A sang tài khoản B và được xác định như sau:
T1 : Read(A);
A:=A-50;
Write(A);
Read(B);
B:=B+50;
Write(B);
Giao dịch T2 chuyển 10% số dư te tài khoản A sang tài khoản B, và được xác định
như sau:
T2 : Read(A);
Temp:=A*0.1;
A:=A-temp;
Write(A);
Read(B);
B:=B+temp;
Write(B);
Giả sp giá trị hiện tại của A và B tương ứng là 1000 $ và 2000 $. Giả sp rằng
hai giao dịch này được thực hiện mỗi một tại một thời điểm theo thứ tự T1 rồi tới T2.
Như vậy, dãy thực hiện này là như hình bên dưới, trong đó dãy các bước ch{ thị ở
trong thứ tự thời gian te đ{nh xuống đáy, các ch{ thị của T1 nằm ở cột trái còn các ch{
thị của T2 nằm ở cột phải:
89
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Schedule-1
Giá trị sau cùng của các tài khoản A và B, sau khi thực hiện dãy các ch{ thị
theo trình tự này là 855$ và 2145 $ tương ứng. Như vậy, tổng giá trị của hai tài khoản
này (A + B) được bảo tồn sau khi thực hiện cả hai giao dịch.
Tương tự, nếu hai giao dịch được thực hiện mỗi một tại một thời điểm song
theo trình tự T2 rồi đến T1 , khi đó dãy thực hiện su là:
Schedule-2
90
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Và kết quả là các giá trị cuối cùng của tài khoản A và B tương ứng su là 850 $
và 2150 $. Các dãy thực hiện vea được mô tả trên được gọi là các lịch trình
(schedules). Chúng biểu dion trình tự thời gian các ch{ thị được thực hiện trong hệ
thống. Một lịch trình đối với một tập các giao dịch phải bao gồm tất cả các ch{ thị của
các giao dich này và phải bảo tồn thứ tự các ch{ thị xuất hiện trong mỗi một giao dịch.
Ví dụ, đối với giao dịch T1 , ch{ thị Write(A) phải xuất hiện trước ch{ thị Read(B),
trong bất kỳ lịch trình hợp lệ nào. Các lịch trình schedule-1 và schedule-2 là tuần tự.
Mỗi lịch trình tuần tự gồm một dãy các ch{ thị te các giao dịch, trong đó các ch{ thị
thuộc về một giao dịch xuất hiện cùng nhau trong lịch trình. Như vậy, đối với một tập
n giao dịch, có n! lịch trình tuần tự hợp lệ khác nhau. Khi một số giao dịch được thực
hiện đồng thời, lịc trình tương ứng không nhất thiết là tuần tự. Nếu hai giao dịch đang
chạy đồng thời, hệ điều hành có thể thực hiện một giao dịch trong một khoảng ngắn
thời gian, sau đó chuyển đổi ngữ cảnh, thực hiện giao dịch thứ hai một khoảng thời
gian sau đó lại chuyển sang thực hiện giao dịch thứ nhất một khoảng và cứ như vậy
(hệ thống chia s thời gian).
Có thể có một vài dãy thực hiện, vì nhiều ch{ thị của các giao dịch có thể đan
xen nhau. Nói chung, không thể dự đoán chính xác những ch{ thị nào của một giao
dịch su được thực hiện trước khi CPU chuyển cho giao dịch khác. Do vậy, số các lịch
trình có thể đối với một tập n giao dịch lớn hơn n! nhiều.
Schedule-3, một lịch trình cạnh tranh tương đương Schedule-1
91
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Không phải tất cả các thực hiện cạnh tranh cho ra một trạng thái đúng. Ví dụ
schedule-4 sau cho ta một minh hoạ về nhận định này:
Sau khi thực hiện giao dịch này, ta đạt tới trạng thái trong đó giá trị cuối của A
và B tương ứng là 950 $ và 2100 $. Trạng thái này là một trạng thái không nhất quán
(A+B trước khi thực hiện giao dịch là 3000$ nhưng sau khi giao dịch là 3050 $). Như
vậy, nếu giao phó việc điều khiển thực hiện cạnh tranh cho hệ điều hành, su có thể dẫn
tới các trạng thái không nhất quán. Nhiệm vụ của hệ CSDL là đảm bảo rằng một lịch
trình được phép thực hiện su đưa CSDL sang một trạng thái nhất quán. Thành phần
của hệ CSDL thực hiện nhiệm vụ này được gọi là thành phần điều khiển cạnh tranh
(concurrency-control component). Ta có thể đảm bảo sự nhất quán của CSDL với thực
hiện cạnh tranh bằng cách nắm chắc rằng một lịch trình được thực hiện có cùng hiệu
quả như một lịch trình tuần tự.
Schedule-4, một lịch trình cạnh tranh
4.5. Tính khả tuần tự
Hệ CSDL phải điều khiển sự thực hiện cạnh tranh các giao dịch để đảm bảo
rằng trạng thái CSDL giữ nguyên ở trạng thái nhất quán. Trước khi ta kiểm tra hệ
CSDL có thể thực hiện nhiệm vụ này như thế nào, đầu tiên ta phải hiểu các lịch trình
nào su đảm bảo tính nhất quán và các lịch trình nào không. Vì các giao dịch là các
chương trình, nên thật khó xác định các hoạt động chính xác được thực hiện bởi một
92
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
giao dịch là hoạt động gì và những hoạt động nào của các giao dịch tác động lẫn nhau.
Vì lý do này, ta su không giải thích kiểu hoạt động mà một giao dịch có thể thực hiện
trên một hạng mục dữ liệu. Thay vào đó, ta ch{ xét hai hoạt động: Read và Write. Ta
cũng giả thiết rằng giữa một ch{ thị Read(Q) và một ch{ thị Write(Q) trên một hạng
mục dữ liệu Q, một giao dịch có thể thực hiện một dãy tuỳ ý các hoạt động trên bản
sao của Q được lưu trú trong buffer cục bộ của giao dịch. Vì vậy ta su ch{ nêu các ch{
thị Read và Write trong lịch trình, như trong biểu dion với quy ước như vậy của
schedule-3 dưới đây:
4.5.1. Tuần tự xung đột
Xét lịch trình S trong đó có hai ch{ thị liên tiếp Ii và Ij của các giao dịch Ti , Tj
tương ứng với i ≠ j. Nếu Ii và Ij tham khảo đến các hạng mục dữ liệu khác nhau, ta có
thể đổi chỗ Ii và Ij mà không làm ảnh hưởng đến kết quả của bất kỳ ch{ thị nào trong
lịch trình. Tuy nhiên, nếu Ii và Ij tham khảo cùng một hạng mục dữ liệu Q, khi đó thứ
tự của hai bước này có thể rất quan trọng. Do ta đang thực hiện ch{ các ch{ thị Read và
Write, nên ta có bốn trường hợp cần phải xét sau:
1. Ii = Read(Q); Ij = Read(Q): Thứ tự của Ii và Ij không gây ra vấn đề nào, do
Ti và Tj đọc cùng một giá trị Q bất kể đến thứ tự giữa Ii và Ij.
2. Ii = Read(Q); Ij = Write(Q): Nếu Ii thực hiện trước Ij, Khi đó Ti không đọc
giá trị được viết bởi Tj bởi ch{ thị Ij . Nếu Ij thực hiện trước Ii , Ti su đọc giá trị của Q
93
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
được viết bởi Ij , như vậy thứ tự của Ii và Ij là quan trọng.
3. Ii = Write(Q); Ij = Read(Q): Thứ tự của Ii và Ij là quan trọng do cùng lý do
trong trường hợp trước.
4. Ii = Write(Q); Ij = Write(Q): Cả hai ch{ thị là hoạt động Write, thứ tự của
hai ch{ thị này không ảnh hưởng đến cả hai giao dịch Ti và Tj . Tuy nhiên, giá trị nhận
được bởi ch{ thị Read kế trong S su bị ảnh hưởng do kết quả phụ thuộc vào ch{ thị
Write được thực hiện sau cùng trong hai ch{ thị Write này. Nếu không còn ch{ thị
Write nào sau Ii và Ij trong S, thứ tự của Ii và Ij su ảnh hưởng trực tiếp đến giá trị cuối
của Q trong trạng thái CSDL kết quả (của lịch trình S).
Như vậy ch{ trong trường hợp cả Ii và Ij là các ch{ thị Read, thứ tự thực hiện
của hai ch{ thị này (trong S) là không gây ra vấn đề.
Ta nói Ii và Ij xung đột nếu các hoạt động này nằm trong các giao dịch khác
nhau, tiến hành trên cùng một hạng mục dữ liệu và có ít nhất một hoạt động là Write.
Ta xét lịch trình schedule-3 như ví dụ minh hoạ cho các ch{ thị xung đột.
Ch{ thị Write(A) trong T1 xung đột với Read(A) trong T2. Tuy nhiên, ch{ thị
Write(A) trong T2 không xung đột với ch{ thị Read(B) trong T1 do các ch{ thị này
truy xuất các hạng mục dữ liệu khác nhau. Ii và Ij là hai ch{ thị liên tiếp trong lịch
trình S. Nếu Ii và Ij là các ch{ thị của các giao dịch khác nhau và không xung đột, khi
đó ta có thể đổi thứ tự của chúng mà không làm ảnh hưởng gì đến kết quả xp lý và
như vậy ta nhận được một lịch trình mới S’ tương đương với S. Do ch{ thị Write(A)
của T2 không xung đột với ch{ thị Read(B) của T1, ta có thể đổi chỗ các ch{ thị này để
được một lịch trình tương đương - schedule-5 dưới đây :
94
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Schedule-5
Ta tiếp tục đổi chỗ các ch{ thị không xung đột như sau:
- Đổi chỗ ch{ thị Read(B) của T1 với ch{ thị Read(A) của T2.
- Đổi chỗ ch{ thị Write(B) của T1 với ch{ thị Write(A) của T2.
- Đổi chỗ ch{ thị Write(B) của T1 với ch{ thị Read(A) của T2.
Kết quả cuối cùng của các bước đổi chỗ này là một lịch trình mới (schedule-6 -
lịch trình tuần tự) tương đương với lịch trình ban đầu (schedule-3):
Schedule-6
Sự tương đương này cho ta thấy: bất chấp trạng thái hệ thống ban đầu, schedule-
3 su sinh ra cùng trạng thái cuối như một lịch trình tuần tự nào đó.
Nếu một lịch trình S có thể biến đổi thành một lịch trình S’ bởi một dãy các đổi chỗ
các ch{ thị không xung đột, ta nói S và S’ là tương đương xung đột (conflict
95
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
equivalent). Trong các schedule đã được nêu ở trên, ta thấy schedule-1 tương đương
xung đột với schedule-3.
Khái niệm tương đương xung đột dẫn đến khái niệm tuần tự xung đột. Ta nói
một lịch trình S là khả tuần tự xung đột (conflict serializable) nếu nó tương đương
xung đột với một lịch trình tuần tự. Như vậy, schedule-3 là khả tuần tự xung đột. Như
một ví dụ, lịch trình schedule-7 dưới đây không tương đương xung đột với một lịch
trình tuần tự nào do vậy nó không là khả tuần tự xung đột:
Schedule-7
Có thể có hai lịch trình sinh ra cùng kết quả, nhưng không tương đương xung
đột. Ví dụ, giao dịch T5 chuyển 10 $ te tài khoản B sang tài khoản A. Ta xét lịch trình
schedule-8 như dưới đây, lịch trình này không tương đương xung đột với lịch trình
tuần tự < T1, T5 > do trong lịch trình schedule-8 ch{ thị Write(B) của T5 xung đột với
ch{ thị Read(B) của T1 như vậy ta không thể di chuyển tất cả các ch{ thị của T1 về
trước các ch{ thị của T5 bởi việc hoán đổi liên tiếp các ch{ thị không xung đột. Tuy
nhiên, các giá trị sau cùng của tài khoản A và B sau khi thực hiện lịch schedule-8 hoặc
sau khi thực hiện lịch trình tuần tự < T1, T5 > là như nhau là 960 và 2040 tương ứng.
Qua ví dụ này ta thấy cần thiết phải phân tích cả sự tính toán được thực hiện bởi các
giao dịch mà không ch{ các hoạt động Read và Write. Tuy nhiên sự phân tích như vậy
su nặng nề và phải trả một giá tính toán cao hơn.
96
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Schedule-8
4.5.2. Tuần tự View
Xét hai lịch trình S và S’, trong đó cùng một tập hợp các giao dịch tham gia vào
cả hai lịch trình. Các lịch trình S và S’ được gọi là tương đương view nếu ba điều kiện
sau được thoả mãn:
1. Đối với mỗi hạng mục dữ liệu Q, nếu giao dịch Ti đọc giá trị khởi đầu của Q
trong lịch trình S, thì giao dịch Ti phải cũng đọc giá trị khởi đầu của Q trong lịch trình
S’.
2. Đối với mỗi hạng mục dữ liệu Q, nếu giao dịch Ti thực hiện Read(Q) trong
lịch trình S và giá trị đó được sản sinh ra bởi giao dịch Tj thì Ti cũng phải đọc giá trị
của Q được sinh ra bởi giao dịch Tj trong S’.
3. Đối với mỗi hạng mục dữ liệu Q, giao dịch thực hiện hoạt động Write(Q)
sau cùng trong lịch trình S, phải thực hiện hoạt động Write(Q) sau cùng trong lịch
trình S’. Điều kiện 1 và 2 đảm bảo mỗi giao dịch đọc cùng các giá trị trong cả hai lịch
trình và do vậy thực hiện cùng tính toán. Điều kiện 3 đi cặp với các điều kiện 1 và 2
đảm bảo cả hai lịch trình cho ra kết quả là trạng thái cuối cùng của hệ thống như nhau.
Trong các ví dụ trước, schedule-1 là không tương tương view với lịch trình 2 do, trong
schedule-1, giá trị của tài khoản A được đọc bởi giao dịch T2 được sinh ra bởi T1 ,
trong khi điều này không xảy ra trong schedule-2. Schedule1 tương đương view với
97
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
schedule-3 vì các giá trị của các tài khoản A và B được đọc bởi T2 được sinh ra bởi T1
trong cả hai lịch trình.
Quan niệm tương đương view đưa đến quan niểm tuần tự view. Ta nói lịch
trình S là khả tuần tự view (view serializable) nếu nó tương dương view với một lịch
trình tuần tự. Ta xét lịch trình sau:
Schedule-9
Nó tương đương view với lịch trình tuần tự < T3, T4, T6 > do ch{ thị Read(Q)
đọc giá trị khởi đầu của Q trong cả hai lịch trình và T6 thực hiện Write sau cùng trong
cả hai lịch trình như vậy schedule-9 khả tuần tự view.
Mỗi lịch trình khả tuần tự xung đột là khả tuần tự view, nhưng có những lịch
trình khả tuần tự view không khả tuần tự xung đột (ví dụ schedule-9).
Trong schedule-9 các giao dịch T4 và T6 thực hiện các hoạt động Write(Q) mà
không thực hiện hoạt động Read(Q), Các Write dạng này được gọi là các Write mù
(blind write). Các Write mù xuất hiện trong bất kỳ lịch trình khả tuần tự view không
khả tuần tự xung đột.
4.6. Tính khả phục hồi
Ta đã nghiên cứu các lịch trình có thể chấp nhận dưới quan điểm sự nhát quán
của CSDL với giả thiết không có giao dịch nào thất bại. Ta su xét hiệu quả của thất bại
giao dịch trong thực hiện cạnh tranh.
Nếu giao dịch Ti thất bại vì lý do nào đó, ta cần hun bm hiệu quả của giao dịch
này để đảm bảo tính nguyên tp của giao dịch. Trong hệ thống cho phép thực hiện cạnh
tranh, cũng cần thiết đảm bảo rằng bất kỳ giao dịch nào phụ thuộc vào Ti cũng phải bị
bm. Để thực hiện sự chắc chắn này, ta cần bố trí các hạn chế trên kiểu lịch trình được
phép trong hệ thống.
98
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
4.6.1. Lịch trình khả phục hồi
Xét lịch trình schedule-10 trong đó T9 là một giao dịch ch{ thực hiện một ch{ thị
Read(A). Giả sp hệ thống cho phép T9 bàn giao (commit) ngay sau khi thực hiện ch{
thị Read(A). Như vậy T9 bàn giao trước T8. Giả sp T8 thất bại trước khi bàn giao, vì
T9 vì T9 đã đọc giá trị của hạng mục giữ liệu A được viết bởi T8 , ta phải bm dở T9 để
đảm bảo tính nguyên tp giao dịch. Song T9 đã được bàn giao và không thể bm dở được.
Ta có tình huống trong đó không thể khôi phục đúng sau thất bại của T8:
Schedule-10
Lịch trình schedule-10 là một ví dụ về lịch trình không phục hồi được và không
dược phép. Hầu hết các hệ CSDL đòi hmi tất cả các lịch trình phải phục hồi được. Một
lịch trình khả phục hồi là lịch trình trong đó, đối với mỗi cặp giao dịch Ti, Tj, nếu Tj
đọc hạng mục dữ liệu được viết bới Ti thì hoạt động bàn giao của Tj phải xảy ra sau
hoạt động bàn giao của Ti .
4.6.2. Lịch trình cascadeless
Ngay cả khi lịch trình là khả phục hồi, để phục hồi đúng sau thất bại của một
giao dịch Ti ta phải cuộn lại một vài giao dịch. Tình huống như thế xảy ra khi các giao
dịch đọc dữ liệu được viết bởi Ti . Ta xét lich trình schedule-11 sau
99
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Giao dịch T10 viết một giá trị được đọc bởi T11 . Giao dịch T12 đọc một giá trị
được viết bởi T11. Giả sp rằng tại điểm này T10 thất bại. T10 phải cuộn lại, do T11 phụ
thuộc vào T10 nên T11 cũng phải cuộn lại và cũng như vậy với T12. Hiện tượng trong
đó một giao dịch thất bại kéo theo một dãy các giao dịch phải cuộn lại được gọi là sự
cuộn lại hàng loạt (cascading rollback).
Cuộn lại hàng loạt dẫn đến việc hun bm một khối lượng công việc đáng kể. Phải
hạn chế các lịch trình để việc cuộn lại hàng loạt không thể xảy ra. Các lịch trình như
vậy được gọi là các lịch trình cascadeless. Một lịch trình cascadeless là một lịch trình
trong đó mỗi cặp giao dịch Ti, Tj nếu Tj đọc một hạng mục dữ liệu đước viết trước đó
bởi Ti, hoạt động bàn giao của Ti phải xuất hiện trước hoạt động đọc của Tj. Một lịch
trình cascadeless là khả phục hồi.
4.6.3. Thực thi cô lập
Có nhiều sơ đồ điều khiển cạnh tranh có thể được sp dụng để đảm bảo các tính
chất một lịch trình phải có (nhằm giữ CSDL ở trạng thái nhất quán, cho phép quản lý
các giao dịch ...), ngay cả khi nhiều giao dịch thực hiện cạnh tranh, ch{ các lịch trình
có thể chấp nhận được sinh ra, bất kể hệ điều hành chia s thời gian tài nguyên như thế
nào giữa các giao dịch.
Như một ví dụ, ta xét một sơ đồ điều khiển cạnh tranh sau: Một giao dịch tậu
một chốt (lock) trên toàn bộ CSDL trước khi nó khởi động và tháo chốt khi nó đã bàn
giao. Trong khi giao dịch giữ chốt không giao dịch nào khác được phép tậu chốt và
như vậy phải chờ đến tận khi chốt được tháo. Trong đối sách chốt, ch{ một giao dịch
được thực hiện tại một thời điểm và như vậy ch{ lịch trình tuần tự được sinh ra. Sơ đồ
điều khiển cạnh tranh này cho ra một hiệu năng cạnh tranh nghèo nàn. Ta nói nó cung
cấp một bậc cạnh tranh nghèo (poor degree of concurrency).
Mục đích của các sơ đồ điều khiển cạnh tranh là cung cấp một bậc canh tranh
cao trong khi vẫn đảm bảo các lịch trình được sinh ra là khả tuần tự xung đột hoặc khả
tuần tự view và cascadeless.
4.7. Định nghĩa giao dịch trong SQL
Chu~n SQL đặc tả sự bắt đầu một giao dịch một cánh không tường minh. Các
giao dịch được kết thúc bởi một trong hai lệnh SQL sau:
100
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
• Commit work bàn giao giao dịch hiện hành và bắt đầu một giao dịch
mới
• Rollback work gây ra sự hun bm giao dịch hiện hành
Te khoá work là chọn lựa trong cả hai lệnh. Nếu một chương trình kết thúc
thiếu cả hai lệnh này, các cập nhật hoặc được bàn giao hoặc bị cuộn lại là các sự thực
hiện phụ thuộc. Chu~n cũng đặc tả hệ thống phải đảm bảo cả tính khả tuần tự và tính
tự do te việc cuộn lại hàng loạt. Định nghĩa tính khả tuần tự được ding bởi chu~n là
một lịch trình phải có cùng hiệu quả như một lịch trình tuần tự như vậy tính khả tuần
tự xung đột và view đều được chấp nhận. Chu~n SQL-92 cũng cho phép một giao dịch
đặc tả nó có thể được thực hiện theo một cách mà có thể làm cho nó trở nên không khả
tuần tự với sự tôn trọng các giao dịch khác. Ví dụ, một giao dịch có thể hoạt động ở
mức Read uncommitted, cho phép giao dịch đọc các m~u tin them chí nếu chúng
không được bàn giao. Đặc điểm này được cung cấp cho các giao dich dài các kết quả
của chúng không nhất thiết phải chính xác. Ví dụ, thông tin xấp x{ thường là đủ cho
các thống kê được dùng cho tối ưu hoá vấn tin.
Các mức nhất quán được đặc tả trong SQL-92 là:
Serializable : mặc nhiên
Repeatable read : ch{ cho phép đọc các record đã được bàn giao, hơn nữa yêu
cầu giữa hai Read trên một record bởi một giao dịch không một giao dịch nào khác
được phép cập nhật record này. Tuy nhiên, giao dịch có thể không khả tuần tự với sự
tôn trọng các giao dịch khác. Ví dụ, khi tìm kiếm các record thoả mãn các điều kiện
nào đó, một giao dịch có thể tìm thấy một vài record được xen bởi một giao dịch đã
bàn giao.
Read committed: Ch{ cho phép đọc các record đã được bàn giao, nhưng không
có yêu cầu thêm trên các Read khả lặp. Ví dụ, giữa hai Read của một record bởi một
giao dịch, các m~u tin có thể được cập nhật bởi các giao dịch đã bàn giao khác.
Read uncommitted: Cho phép đọc cả các record chưa được bàn giao. Đây là
mức nhất quán thấp nhất được phép trong SQL-92.
4.7.1. Kiểm thử tính khả tuần tự
Khi thiết kế các sơ đồ điều khiển cạnh tranh, ta phải chứng tm rằng các lịch
trình được sinh ra bởi sơ đồ là khả tuần tự. Để làm điều đó, trước tiên ta phải biết làm
101
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
thế nào để xác định, với một lịch trình cụ thể đã cho, có là khả tuần tự hay không.
4.7.2. Kiểm thử tính khả tuần tự xung đột
Giả sp S là một lịch trình. Ta xây dựng một đồ thị định hướng, được gọi là đồ
thị trình tự (precedence graph), te S. Đồ thị gồm một cặp (V, E) trong đó V là tập các
đ{nh và E là tập các cung. Tập các đ{nh bao gồm tất cả các giao dịch tham gia vào lịch
trình. Tập các cung bao gồm tất cả các cung dạng Ti → Tjsao cho một trong các điều
kiện sau được thoả mãn:
1. Ti thực hiện Write(Q) trước Tj thực hiện Read(Q).
2. Ti thực hiện Read(Q) trước khi Tj thực hiện Write(Q).
3. Ti thực hiện Write(Q) trước khi Tj thực hiện Write(Q).
Nếu một cung Ti → Tj tồn tại trong đồ thị trình tự, thì trong bất kỳ lịch trình tuần tự S’
nào tương đương với S, Ti phải xuất hiện trước Tj.
Đồ thị trình tự đối với schedule-1 là: vì tất cả các ch{ thị của
T1 được thực hiện trước ch{ thị đầu tiên của T2.
Đồ thị trình tự đối với schedule-2 là: vì tất cả các ch{ thị của
T2 được thực hiện trước ch{ thị đầu tiên của T1.
Đồ thị trình tự đối với schedule-4 chứa các cung T1→ T2 vì T1 thực hiện
Read(A) trước T2 thực hiện Write(A). Nó cũng chứa cung T2 → T1 vì T2 thực hiện
Read(B) trước khi T1 thực hiện Write(B):
Nếu đồ thị trình tự đối với S có chu trình, khi đó lịch trình S không là khả tuần
tự xung đột. Nếu đồ thị không chứa chu trình, khi đó lịch trình S là khả tuần tự xung
đột. Thứ tự khả tuần tự có thể nhận được thông qua sắp xếp topo (topological sorting),
nó xác định một thứ tự tuyến tính nhất quán với thứ tự bộ phận của đồ thị trình tự. Nói
chung, có một vài thứ tự tuyến tính có thể nhận được qua sắp xếp topo. Ví dụ, đồ thị
sau:
102
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Có hai thứ tự tuyến tính chấp nhận được là:
Như vậy, để kiểm thp tính khả tuần tự xung đột, ta cần xây dựng đồ thị trình tự
và gọi thuật toán phát hiện chu trình. Ta nhận được một sơ đồ thực nghiệm để xác
định tính khả tuần tự xung đột. Như ví dụ, schedule-1 và schedule-2, đồ thị trình tự
của chúng không có chu trình, do vậy chúng là các chu trình khả tuần tự xung đột,
trong khi đồ thị trình tự của schedule-4 chứa chu trình do vậy nó không là khả tuần tự
xung đột.
4.7.3. Kiểm thử tính khả tuần tự View
Ta có thể spa đổi phép kiểm thp đồ thị trình tự đối với tính khả tuần tự xung đột
dể kiểm thp tính khả tuần tự view. Tuy nhiên, phép kiểm thp này phải trả giá cao về
thời gian chạy.
Xét lịch trình schedule-9, nếu ta tuân theo quy tắc trong phép kiểm thp tính khả
tuần tự xung đột để tạo đồ thị trình tự, ta nhận được đồ thị sau:
103
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Đồ thị này có chu trình, do vậy schedule-9 không là khả tuần tự xung đột. Tuy
nhiên, đã đã thấy nó là khả tuần tự view (do nó tương đương với lịch trình tuần tự <
T3, T4 , T6 >). Cung T3 → T4 không được xen vào đồ thị vì các giá trị của hạng mục Q
được sản sinh bởi T3 và T4 không được dùng bởi bất kỳ giao dịch nào khác và T6 sản
sinh ra giá trị cuối mới của Q. Các ch{ thị Write(Q) của T3 và T4 được gọi là các
Write vô dụng (Useless Write). Điều trên ch{ ra rằng không thể sp dụng đơn thuần sơ
đồ đồ thị trình tự dể kiểm thp tính khả tuần tự view. Cần thiết phát triển một sơ đồ cho
việc quyết định cung nào là cần phải xen vào đồ thị trình tự.
Xét một lịch trình S. Giả sp giao dịch Tj đọc hạng mục dữ liệu Q được viết bởi
Ti . Rõ ràng là nếu S là khả tuần tự view, khi đó, trong bất kỳ lịch trình tuần tự S’
tương đương với S, Ti phải đi trước Tj . Bây giờ giả sp rằng, trong lịch trình S, giao
dịch Tk thực hiện một Write(Q), khi đó, trong lịch trình S’, Tk phải hoặc đi trước Ti
hoặc đi sau Tj . Nó không thể xuất hiện giữa Ti và Tj vì như vậy Tj không đọc giá trị
của Q được viết bởi Ti và như vậy S không tương đương view với S’. Các ràng buộc
này không thể biểu dion được trong thuật ngữ của mô hình đồ thị trình tự đơn giản
được nêu lên trước đây. Như trong ví dụ trước, khó khăn nảy sinh ở chỗ ta biết một
trong hai cung Tk → Ti và Tj → Tk phải được xen vào đồ thị nhưng ta chưa tạo được
quy tắc để xác định sự lựa chọn thích hợp. Để tạo ra quy tắc này, ta cần mở rộng đồ thị
định hướng để bao hàm các cung gán nhãn, ta gọi đồ thị như vậy là đồ thị trình tự gán
nhãn (Label precedence graph). Cũng như trước đây, các nút của đồ thị là tất cả các
giao dịch tham gia vào lịch trình. Các quy tắc xen cung gán nhãn được dion giải như
sau:
Giả sp S là lịch trình gồm các giao dịch { T1, T2, ... , Tn }. Tb và Tf là hai giao
dịch giả: Tb phát ra Write(Q) đối với mỗi Q được truy xuất trong S, Tf phát ra
Read(Q) đối với mỗi Q được truy xuất trong S. Ta xây dựng lich trình mới S’ te S
104
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
bằng cách xen Tb ở bắt đầu của S và Tf ở cuối của S. Đồ thị trình tự gán nhãn đố với
S’ được xây dung dựa trên các quy tắc:
1. Thêm cung Ti → 0 Tj , nếu Tj đọc giá trị của hạng mục dữ liệu Q được viết
bởi Ti.
2. Xoá tất cả các cung liên quan tới các giao dịch vô dụng. Một giao dịch Ti
được gọi là vô dụng nếu không có con đường nào trong đồ thị trình tự dẫn te Ti đến Tf.
3. Đối với mỗi hạng mục dữ liệu Q sao cho Tj đọc giá trị của Q được viết bởi Ti
và Tk thực hiện Write(Q), Tk ≠Tb tiến hành các bước sau :
a. Nếu Ti = Tb và Tj ≠Tf, khi đó xen cung Tj → 0 Tk vào đồ thị trình tự gán nhãn.
b. Nếu Ti ≠ Tb và Tj = Tf khi đó xen cung Tk → 0 Ti vào đồ thị trình tự gán nhãn.
c. Nếu Ti ≠ Tb và Tj ≠ Tf khi đó xen cả hai cung Tk → p Ti và Tj → p Tk vào đồ thị trình
tự gán nhãn, trong đó p là một số nguyên duy nhất lớn hơn 0 mà chưa được sp dụng
trước đó để gán nhãn cung.
Quy tắc 3c phản ánh rằng nếu Ti viết hạng mục dữ liệu được đọc bởi Tj thì một
giao dịch Tk viết cùng hạng mục dữ liệu này phải hoặc đi trước Ti hoặc đi sau Tj. Quy
tắc 3a và 3b là trường hợp đặc biệt là kết quả của sự kiện Tb và Tf cần thiết là các giao
dịch đầu tiên và cuối cùng tương ứng. Như một ví dụ, ta xét schedule-7. Đồ thị trình tự
gán nhãn của nó được xây dựng qua các bước 1 và 2 là:
Đồ thị sau cùng của nó là (cung T3 → T4 là kết quả của 3a, cung T4 → T3 là kết
quả của 3b) :
105
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Đồ thị trình tự gán nhãn của schedule-9 là:
Cuối cùng, ta xét lịch trình schedule-10:
Đồ thị trình tự gán nhãn của schedule-10 là:
106
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
T3
0 0 1 0 1
Tb
T4 Tf
0 0
T7
Đồ thị trình tự gán nhãn của schedule-7 chứa chu trình tối tiểu : T3 → T4 → T3
Đồ thị trình tự gán nhãn của schedule-10 chứa chu trình tối tiểu: T3 → T1 → T3
Đồ thị trình tự gán nhãn của schedule-9 không chứa chứa chu trình nào.
Nếu đồ thị trình tự gán nhãn không chứa chu trình, lịch trình tương ứng là khả
tuàn tự view, như vậy schedule-9 là khả tuần tự view. Tuy nhiên, nếu đồ thị chứa chu
trình, điều kiện này không kéo theo lịch trình tương ứng không là khả tuần tự view.
Đồ thị trình tự gán nhãn của schedule-7 chứa chu trình và lịch trình này không là khả
tuần tự view. Bên cạnh đó, lịch trình schedule-10 là khả tuần tự view, nhưng đồ thị
trình tự gán nhãn của nó có chứa chu trình. Bây giờ ta giả sp rằng có n cặp cung tách
biệt, đó là do ta đã áp dụng n lần quy tắc 3c trong sự xây dựng đồ thị trình tự. Khi đó
có 2n đồ thị khác nhau, mỗi một chứa đúng một cung trong mỗi cặp. Nếu một đồ thị
nào đó trong các đồ thị này là phi chu trình, khi đó lịch trình tương ứng là khả tuần tự
view. Thuật toán này đòi hmi một phép kiểm thp vét cạn các đồ thị riêng biệt, và như
vậy thuộc về lớp vấn đề NP-đầy đủ.
Ta xét đồ thị schedule-10. nó có đúng một cặp tách biệt. Hai đồ thị riêng biệt
là:
107
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Đồ thị thứ nhất không chứa chu trình, do vậy lịch trình là khả tuần tự view.
108
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Câu hỏi
1. Hãy nêu và phân tích các tính chất cần có của một giao dịch.
2. Trong khi thực hiện, một giao dịch trải qua một vài trạng thái đến tận khi nó bàn giao
hoặc bm dở. Liệt kê tất cả các dãy trạng thái có thể giao dịch có thể trải qua. Giải thích tại sao
mỗi bắc cầu trạng thái có thể xảy ra.
3. Giải thích sự khác biệt giữa lịch trình tuần tự (Serial schedule) và lịch trình khả tuần tự
(Serializable schedule).
4. Xét hai giao dịch sau:
T1 : Read(A);
Read(B);
If A=0 then B:=B+1;
Write(B).
T2 : Read(B);
Read(A);
If B=0 then A:=A+1;
Write(A).
Giả thiết yêu cầu nhất quán là A=0 V B=0 với A=B=0 là các giá trị khởi đầu
a. Chứng tm rằng mỗi sự thự hiện tuần tự bao gồm hai giao dịch này bảo tồn tính
nhất quán của CSDL.
b. Nêu một sự thực hiện cạnh tranh của T1 và T2 sinh ra một lịch trình không khả
tuần tự.
c. Có một sự thực hiện cạnh tranh của T1 và T2 sinh ra một lịch trình khả tuần tự
không ?
5. Do một lịch trình khả tuần tự xung đột là một lịch trình khả tuần tự view. Tại sao ta lại
nhấn mạnh tính khả tuần tự xung đột hơn tính khả tuần tự view?
6. Xét đồ thị trình tự sau:
109
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Lịch trình tương ứng là khả tuần tự xung đột không? Giải thích
7. Xét đồ thị trình tự gán nhãn sau:
Lịch trình tương ứng là khả tuần tự view không? Giải thích.
8. Lịch trình khả phục hồi là gì? Tại sao cần thiết tính khả phục hổi của một lịch trình?
9. Lịch trình cascadeless là gì? Tại sao cần thiết tính cascadeless của lịch trình?
110
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Chương 5
ĐIỀU KHIỂN CẠNH TRANH
5.1. Giao thức dựa trên chốt
Một phương pháp để đảm bảo tính khả tuần tự là yêu cầu việc truy xuất đến
hạng mục dữ liệu được tiến hành theo kiểu loại trừ tương hỗ; có nghĩa là trong khi
một giao dịch đang truy xuất một hạng mục dữ liệu, không một giao dịch nào khác có
thể sửa đổi hạng mục này. Phương pháp chung nhất được dùng để thực thi yêu cầu
này là cho phép một giao dịch truy xuất một hạng mục dữ liệu chỉ nếu nó đang giữ
chốt trên hạng mục dữ liệu này.
5.1.1. Chốt
Có nhiều phương thức chốt hạng mục dữ liệu. Ta hạn chế việc nghiên cứu trên
hai phương thức:
1. Shared. Nếu một giao dịch Ti nhận được một chốt ở phương thức shared (ký
hiệu là S) trên hạng mục Q, khi đó Ti có thể đọc, nhưng không được viết Q.
2. Exclusive. Nếu một giao dịch Ti nhận được một chốt ở phương thức
Exclusive (ký hiệu là X), khi đó Ti có thể cả đọc lẫn viết Q.
Ta yêu cầu là mỗi giao dịch đòi hỏi một chốt ở một phương thức thích hợp trên hạng
mục dữ liệu Q, phụ thuộc vào kiểu hoạt động mà nó sẽ thực hiện trên Q. Giả sử một
giao dịch Ti đòi hỏi một chốt phương thức A trên hạng mục Q mà trên nó giao dich Tj
(Tj ≠ Ti) hiện đang giữ một chốt phương thức B. Nếu giao dịch Ti có thể được cấp
một chốt trên Q ngay, bất chấp sự hiện diện của chốt phương thức B, khi đó ta nói
phương thức A tương thích với phương thức B. Một hàm như vậy có thể được biểu
diễn bởi một ma trận. Quan hệ tương thích giữa hai phương thức chốt được cho bởi
ma trận comp sau:
S X
S True False
X False False
Comp(A, B)= true có nghĩa là các phương thức A và B tương thích. Các chốt
phương thức shared có thể được giữ đồng thời trên một hạng mục dữ liệu. Một
chốt exclusive đến sau phải chờ đến tận khi tất cả các chốt phương thức shared
đếntrước được tháo ra.
111
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Một giao dịch yêu cầu một chốt shared trên hạng mục dữ liệu Q bằng cách
thực hiện chỉ thị lock-S(Q), yêu cầu một chốt exclusive thông qua chỉ thị lock-X(Q).
Một hạng mục dữ liệu Q có thể được tháo chốt thông qua chỉ thị unlock(Q).
Để truy xuất một hạng mục dữ liệu, giao dịch Ti đầu tiên phải chốt hạng mục
này. Nếu hạng mục này đã bị chốt bởi một giao dịch khác ở phương thức không
tương thích, bộ điều khiển cạnh tranh sẽ không cấp chốt cho đến tận khi tất cả các
chốt không tương thích bị giữ bởi các giao dịch khác được tháo. Như vậy Ti phải chờ
đến tận khi tất cả các chốt không tương thích bị giữ bởi các giao dịch khác được giải
phóng.
Giao dịch Ti có thể tháo chốt một hạng mục dữ liệu mà nó đã chốt trước đây.
Một giao dịch cần thiết phải giữ một chốt trên một hạng mục dữ liệu chừng nào mà
nó còn truy xuất hạng mục này. Hơn nữa, đối với một giao dịch việc tháo chốt ngay
sau truy xuất cuối cùng đến hạng mục dữ liệu không luôn luôn là điều mong muốn vì
như vậy tính khả tuần tự có thể không được đảm bảo. Để minh hoạ cho tình huống
này, ta xét ví dụ sau: A và B là hai tài khoản có thể được truy xuất bởi các giao dịch
T1 và T2 .
Giao dịch T1 chuyển 50$ từ tài khoản B sang tài khoản A và được xác định
như sau:
T1 : Lock-X(B);
Read(B);
B:=B-50;
Write(B);
Unlock(B);
Lock-X(A);
Read(A);
A:=A+50;
Write(A);
Unlock(A);
Giao dịch T2 hiển thị tổng số lượng tiền trong các tài khoản A và B (A + B) và
được xác định như sau;
T2 : Lock-S(A);
Read(A);
Unlock(A);
Lock-S(B);
112
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Read(B);
Unlock(B);
Display(A+B);
Giả sử giá trị của tài khoản A và B tương ứng là 100 $ và 200 $. Nếu hai giao
dịch này thực hiện tuần tự, hoặc theo thứ tự T1, T2 hoặc theo thứ tự T2, T1, và khi dó
T2 sẽ hiển thị giá trị 300 $. Tuy nhiên nếu các giao dịch này thực hiện cạnh tranh, giả
sử theo lịch trình schedule-1, trong trường hợp như vậy giao dịch T2 sẽ hiển thị giá trị
250 $ một kết quả không đúng. Lý do của sai lầm này là do giao dịch T1 đã tháo chốt
hạng mục B quá sớm và T2 đã tham khảo một trạng
thái không nhất quán.
Lịch trình schedule 1 bày tỏ các hành động được thực hiện bởi các giao dịch
cũng như các thời điểm khi các chốt được cấp bởi bộ quản trị điều khiển cạnh tranh.
Giao dịch đưa ra một yêu cầu chốt không thể thực hiện hành động kế của mình đến
tận khi chốt được cấp bởi bộ quản trị điều khiển cạnh tranh; do đó, chốt phải được
cấp trong khoảng thời gian giữa hoạt động yêu cầu chốt và hành động sau của giao
dịch. Sau này ta sẽ luôn giả thiết chốt được cấp cho giao dịch
ngay trước hành động kế và như vậy ta có thể bỏ qua cột bộ quản trị điều khiển cạnh
tranh trong bảng .
Schedule-1
113
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Bây giờ giả sử rằng tháo chốt bị làm trễ đến cuối giao dịch. Giao dịch T3
tương ứng với T1 với tháo chốt bị làm trễ được định nghĩa như sau:
T3 : Lock-X(B);
Read(B);
B:=B-50;
Write(B);
Lock-X(A);
Read(A);
A:=A+50;
Write(A);
Unlock(B);
Unlock(A);
Giao dịch T4 tương ứng với T2 với thá chốt bị làm trễ được xác định như sau:
T4 : Lock-S(A);
Read(A);
Lock-S(B);
Read(B);
Display(A+B);
Unlock(A);
Unlock(B);
Các lịch trình có thể trên T3 và T4 không để cho T4 hiển thị trạng thái không
nhất quán. Tuy nhiên, sử dụng chốt có thể dẫn đến một tình huống không mong đợi.
Ta hãy xét lịch trình bộ phận schedule-2 trên T3 và T4 sau:
Schedule-2
114
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Do T3 giữ một chốt phương thức Exclusive trên B, nên yêu cầu một chốt
phương thức shared của T4 trên B phải chờ đến khi T3 tháo chốt. Cũng vậy, T3 yêu
cầu một chốt Exclusive trên A trong khi T4 đang giữ một chốt shared trên nó và như
vậy phải chờ. Ta gặp phải tình huống trong đó T3 chờ đợi T4 đồng thời T4 chờ đợi T3
một sự chờ đợi vòng tròn, và như vậy không giao dịch nào có thể tiến triển. Tình
huống này được gọi là deadlock (khoá chết). Khi tình huống khoá chết xảy ra hệ
thống buộc phải cuộn lại một trong các giao dịch. Mỗi khi một giao dịch bị cuộn lại,
các hạng mục dữ liệu bị chốt bởi giao dịch phải được tháo chốt và nó trở nên sẵn có
cho giao dịch khác, như vậy các giao dịch này có thể tiếp tục được sự thực hiện của
nó.
Nếu ta không sử dụng chốt hoặc tháo chốt hạng mục dữ liệu ngay khi có thể
sau đọc hoặc viết hạng mục, ta có thể rơi vào trạng thái không nhất quán. Mặt khác,
nếu ta không tháo chốt một hạng mục dữ liệu trước khi yêu cầu một chốt trên một
hạng mục khác, dealock có thể xảy ra. Có các phương pháp tránh dealock trong một
số tình huống, tuy nhiên nói chung dealock là khó tránh khi sử dụng chốt nếu ta
muốn tránh trạng thái không nhất quán. Dealock được ưa thích hơn trạng thái không
nhất quán vì chúng có thể điều khiển được bằng cách cuộn lại các giao dịch trong khi
đó trạng thái không nhất quán có thể dẫn đến các vấn đề thực tế mà hệ CSDL không
thể điều khiển.
Ta sẽ yêu cầu mỗi giao dịch trong hệ thống tuân theo một tập các quy tắc ,
được gọi là giao thức chốt (locking protocol), chỉ định khi một giao dịch có thể chốt
và tháo chốt mỗi một trong các hạng mục dự liệu. Giao thức chốt hạn chế số các lịch
trình có thể. Tập các lịch trình như vậy là một tập con thực sự của tập tất cả các lịch
trình khả tuần tự có thể.
Xét { T0 , T1 , ..., Tn } một tập các giao dịch tham gia vào lịch trình S. Ta nói
Ti đi trước Tj trong S, và được viết là Ti → Tj , nếu tồn tại một hạng mục dữ liệu Q
sao cho Ti giữ chốt phương thức A trên Q , Tj giữ chốt phương thức B trên Q muộn
hơn và comp(A,B) = false. Nếu Ti → Tj , thì Ti sẽ xuất hiện trước Tj trong bất kỳ lịch
trình tuần tự nào. Ta nói một lịch trình S là hợp lệ dưới một giao thức chốt nếu S là
một lịch trình tuân thủ các quy tắc của giao thức chốt đó. Ta nói rằng một giao thức
chốt đảm bảo tính khả tuần tự xung đột nếu và chỉ nếu đối với tất cả các lịch trình
hợp lệ, quan hệ → kết hợp là phi chu trình.
5.1.2. Cấp chốt
Khi một giao dịch yêu cầu một chốt trên một hạng mục dữ liệu ở một phương
115
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
thức và không có một giao dịch nào khác giữ một chốt trên cùng hạng mục này ở một
phương thức xung đột, chốt có thể được cấp. Tuy nhiên, phải thận trọng để tránh kịch
bản sau: giả sử T2 giữ một chốt phương thức shared trên một hạng mục dữ liệu, một
giao dịch khác T1 yêu cầu một chốt phương thức exclusive cũng trên hạng mục này,
rõ ràng T1 phải chờ T2 tháo chốt. Trong khi đó một giao dịch khác T3 yêu cầu một
chốt phương thức shared, do yêu cầu chốt này tương thích với phương thức chốt
được giữ bởi T1 nên nó được cấp cho T3. Tại thời điểm T2 tháo chốt, T1 vẫn phải chờ
sự tháo chốt của T3, nhưng bây giờ lại có một giao dịch T4 yêu cầu một chốt phương
thức shared và nó lại được cấp do tính tương thích và cứ như vậy, có thể T1 sẽ không
bao giờ được cấp chốt mà nó yêu cầu trên hạng mục dữ liệu. Ta gọi hiện tượng này là
bị chết đói (starved).
Để tránh sự chết đói của các giao dịch, việc cấp chốt được tiến hành như sau:
Khi một giao dịch Ti yêu cầu một chốt trên một hạng mục dữ liệu Q ở phương thức
M, chốt sẽ được cấp nếu các điều kiện sau được thoả mãn:
1. Không có giao dịch khác đang giữ một chốt trên Q ở phương thức xung đột
với M .
2. Không có một giao dịch nào đang chờ được cấp một chốt trên M và đã đưa
ra yêu cầu về chốt trước Ti .
5.1.3. Giao thức chốt hai kỳ
Giao thức chốt hai kỳ là một giao thức đảm bảo tính khả tuần tự. Giao thức
này yêu cầu mỗi một giao dịch phát ra yêu cầu chốt và tháo chốt thành hai kỳ:
1. Kỳ xin chốt (Growing phase). Một giao dịch có thể nhận được các chốt,
nhưng có không thể tháo bất kỳ chốt nào
2. Kỳ tháo chốt (Shrinking phase). Một giao dịch có thể tháo các chốt nhưng
không thể nhận được một chốt mới nào.
Khởi đầu, một giao dịch ở kỳ xin chốt. Giao dịch tậu được nhiều chốt như cần
thiết. Mỗi khi giao dịch tháo một chốt, nó đi vào kỳ tháo chốt và nó không thể phát ra
bất kỳ một yêu cầu chốt nào nữa. Các giao dich T3 và T4 là hai kỳ. Các giao dịch T1
và T2 không là hai kỳ. Người ta có thể chứng minh được giao thức chốt hai kỳ đảm
bảo tính khả tuần tự xung đột, nhưng không đảm bảo tránh được dealock và việc
cuộn lại hàng loạt. Cuộn lại hàng loạt có thể tránh được bởi một sự sửa đổi chốt hai
kỳ được gọi là giao thức chốt hai kỳ nghiêm ngặt. Chốt hai kỳ nghiêm ngặt đòi hỏi
thêm tất cả các chốt phương thức exclusive phải được giữ đến tận khi giao dịch bàn
116
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
giao. Yêu cầu này đảm bảo rằng bất kỳ dữ liệu nào được viết bởi một giao dịch chưa
bàn giao bị chốt trong phương thức exclusive đến tận khi giao dịch bàn giao, điều đó
ngăn ngừa bất kỳ giao dịch khác đọc dữ liệu này.
Một biến thể khác của chốt hai kỳ là giao thức chốt hai kỳ nghiêm khắc. Nó đòi hỏi
tất cả các chốt được giữ đến tận khi giao dịch bàn giao. Hầu hết các hệ CSDL thực
hiện chốt hai kỳ nghiêm ngặt hoặc nghiêm khắc.
Một sự tinh chế giao thức chốt hai kỳ cơ sở dựa trên việc cho phép chuyển đổi
chốt: nâng cấp một chốt shared sang exclusive và hạ cấp một chốt exclusive thành
chốt shared. Chuyển đổi chốt không thể cho phép một cách tuỳ tiện, nâng cấp chỉ
được phép diễn ra trong kỳ xin chốt, còn hạ cấp chỉ được diễn ra trong kỳ tháo chốt.
Một giao dịch thử nâng cấp một chốt trên một hạng mục dữ liệu Q có thể phải chờ.
Giao thức chốt hai kỳ với chuyển đổi chốt cho phép chỉ sinh ra các lịch trình khả tuần
tự xung đột. Nếu các chốt exclusive được giữ đến tận khi bàn giao, các lịch trình sẽ là
cascadeless.
Ta xét một ví dụ: Các giao dịch T8 và T9 được nêu trong ví dụ chỉ được trình
bày bởi các hoạt động ý nghĩa là Read và Write.
T8 : Read(A1);
Read(A2);
…………
Read(An);
Write(A1).
T9 : Read(A1);
Read(A2);
Display(A1 + A2)
Nếu ta sử dụng giao thức chốt hai kỳ, khi đó T8 phải chốt A1 ở phương thức
exclusive. Bởi vậy, sự thực hiện cạnh tranh của hai giao dịch rút cuộc trở thành thực
hiện tuần tự. Ta thấy rằng T8 cần một chốt exclusive trên A1 chỉ ở cuối sự thực hiện
của nó, khi nó write(A1). Như vậy, T8 có thể khởi động chốt A1 ở phương thức
shared, và đổi chốt này sang phương thức exclusive sau này. Như vậy ta có thể nhận
được tính cạnh tranh cao hơn, vì như vậy T8 và T9 có thể truy xuất đến A1 và A2
đồng thời.
Ta biểu thị sự chuyển đổi từ phương thức shared sang phương thức exclusive
bởi upgrade và từ phương thức exclusive sang phương thức shared bởi downgrade.
117
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Upgrade chỉ được phép xảy ra trong kỳ xin chốt và downgrade chỉ được phép xảy ra
trong kỳ tháo chốt. Lịch trình chưa hoàn tất dưới đây cho ta một minh hoạ về giao
thức chốt hai kỳ với chuyển đổi chốt.
Chú ý rằng một giao dịch thử cập nhật một chốt trên một hạng mục dữ liệu Q
có thể buộc phải chờ. Việc chờ bắt buộc này xảy ra khi Q đang bị chốt bởi giao dịch
khác ở phương thức shared.
Giao thức chốt hai kỳ với chuyển đổi chốt chỉ sinh ra các lịch trình khả tuần tự
xung đột, các giao dịch có thể được tuần tự hoá bởi các điểm chốt của chúng. Hơn
nữa, nếu các chốt exclusive được giữ đến tận khi kết thúc giao dịch, lịch trình sẽ là
cascadeless.
Ta mô tả một sơ đồ đơn giản nhưng dược sử dụng rộng rãi để sinh tự động các
chỉ thị chốt và tháo chốt thích hợp cho một giao dịch: Mỗi khi giao dich T xuất ra
một chỉ thị Read(Q), hệ thống sẽ xuất ra một chỉ thị Lock-S(Q) ngay trước chỉ thị
Read(Q). Mỗi khi giao dịch T xuất ra một hoạt động Write(Q), hệ thống sẽ kiểm tra
xem T đã giữ một chốt shared nào trên Q hay chưa, nếu đã, nó xuất ra một chỉ thị
Upgrade(Q) ngay trước chỉ thị Write(Q), nếu chưa, nó xuất ra chỉ thị Lock-X(Q)
ngay trước Write(Q). Tất cả các chốt giao dịch nhận được sẽ được tháo chốt sau khi
giao dịch bàn giao hay bỏ dở.
5.1.4. Giao thức dựa trên đồ thị
Ta đã biết, trong trường hợp thiếu vắng các thông tin liên quan đến cách thức
các hạng mục dữ liệu được truy xuất, giao thức chốt hai kỳ là cần và đủ để đảm bảo
tính khả tuần tự. Nếu ta muốn phát triển các giao thức không là hai kỳ, ta cần các
thông tin bổ xung trên cách thức mỗi giao dịch truy xuất CSDL. Có nhiều mô hình
118
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
khác nhau về lượng thông tin được cung cấp. Mô hình đơn giản nhất đòi hỏi ta phải
biết trước thứ tự trong đó các hạng mục dữ liệu sẽ được truy xuất. Với các thông tin
như vậy, có thể xây dựng các giao thức chốt không là hai kỳ nhưng vẫn đảm bảo tính
khả tuần tự xung đột.
Để có được hiểu biết trước như vậy, ta áp đặt một thứ tự bộ phận, ký hiệu →,
trên tập tất cả các hạng mục dữ liệu D ={ d1 , d2 , ..., dn }. Nếu di → dj , bất kỳ giao
dịch nào truy xuất cả di và dj phải truy xuất di trước khi truy xuất dj. Thứ tự bộ phận
này cho phép xem D như một đồ thị định hướng phi chu trình, được gọi là đồ thị
CSDL (DataBase Graph). Trong phần này, để đơn giản, ta hạn chế chỉ xét các đồ thị
là các cây và ta sẽ đưa ra một giao thức đơn giản, được gọi là giao thức cây (tree
protocol), giao thức này hạn chế chỉ dùng các chốt exclusive.
Trong giao thức cây, chỉ cho phép chỉ thị chốt Lock-X, mỗi giao dịch T có thể
chốt một hạng mục dữ liệu nhiều nhất một lần và phải tuân theo các quy tắc sau:
1. Chốt đầu tiên bởi T có thể trên bất kỳ hạng mục dữ liệu nào
2. Sau đó, một hạng mục dữ liệu Q có thể bị chốt bởi T chỉ nếu cha của Q hiện
đang bị chốt bởi T
3. Các hạng mục dữ liệu có thể được tháo chốt bất kỳ lúc nào
4. Một hạng mục dữ liệu đã bị chốt và được tháo chốt bởi T, không thể bị T
chốt lại lần nữa. Các lịch trình hợp lệ trong giao thức cây là khả tuần tự xung đột. Ví
dụ 6.1. Cây CSDL là:
Chỉ các chỉ thị chốt và tháo chốt của các giao dịch được trình bày:
T10: Lock-X(B); Lock-X(E); Lock-X(D); Unlock(B); Unlock(E); Lock-X(G);
Unlock(D); Unlock(G).
T11 : Lock-X(D); Lock-X(H); Unlock(D); Unlock(H).
119
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
T12 : Lock-X(B); Lock-X(E); Unlock(B); Unlock(E).
T13 : Lock-X(D); Lock-X(H); Unlock(D); Unlock(H).
Một lịch trình tuân theo giao thức cây chứa tất cả bốn giao dịch trên được cho
trong hình bên dưới. Ta nhận thấy, các lịch trình tuân thủ giao thức cây không chỉ là
khả tuần tự xung đột mà còn đảm bảo không có dealock. Giao thức cây có mặt thuận
lợi so với giao thức hai kỳ là tháo chốt có thể xảy ra sớm hơn. Việc tháo chốt sớm có
thể dẫn đến rút ngắn thời gian chờ đợi và tăng tính cạnh tranh. Hơn nữa, do giao thức
là không dealock, nên không có cuộn lại. Tuy nhiên giao thức cây có điểm bất lợi là,
trong một vài trường hợp, một giao dịch có thể phải chốt những hạng mục dữ liệu mà
nó không truy xuất. Chẳng hạn, một giao dịch cần truy xuất các hạng mục dữ liệu A
và J trong đồ thị CSDL trên, phải chốt không chỉ A và J mà phải chốt cả các hạng
mục B, D, H. Việc chốt bổ xung này có thể gây ra việc tăng tổng phí chốt, tăng thời
gian chờ đợi và giảm tính cạnh tranh. Hơn nữa, nếu không biết trước các hạng mục
dữ liệu nào sẽ cần thiết phải chốt, các giao dịch sẽ phải chốt gốc của cây mà điều này
làm giảm mạnh tính cạnh tranh.
Đối với một tập các giao dịch, có thể có các lịch trình khả tuần tự xung đột
không thể nhận được từ việc tuân theo giao thức cây. Có các lịch trình được sinh ra
bởi tuân theo giao thức chốt hai kỳ nhưng không thể được sinh ra bởi tuân theo giao
thức cây và ngược lại.
Lịch trình khả tuần tự dưới giao thức cây
5.1.5. Đa hạt
120
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Trong các sơ đồ điều khiển cạnh tranh được mô tả trước đây, ta đã sử dụng
hạng mục dữ liệu như đơn vị trên nó sự đồng bộ hoá được thực hiện. Tuy nhiên, có
các hoàn cảnh trong đó việc nhóm một vài hạng mục dữ liệu và xử lý chúng như một
đơn vị đồng bộ hoá mang lại nhiều lợi ích. Nừu một giao dich Ti phải truy xuất toàn
bộ CSDL và giao thức chốt được sử dụng, khi đó Ti phải chốt mỗi hạng mục dữ liệu
trong CSDL. Như vậy việc thực hiện các chốt này sẽ tiêu tốn một thời gian đáng kể.
Sẽ hiệu quả hơn nếu Ti chỉ cần một yêu cầu chốt để chốt toàn bộ CSDL. Mặt khác,
nếu Ti cần truy xuất chỉ một vài hạng mục dữ liệu, nó không cần thiết phải chốt toàn
bộ CSDL vì như vậy sẽ giảm tính cạnh tranh. Như vậy, cái mà ta cần là một cơ chế
cho phép hệ thống xác định nhiều mức hạt. Một cơ chế như vậy là cho phép các hạng
mục dữ liệu có kích cỡ khác nhau và xác định một sự phân cấp các hạt dữ liệu, trong
đó các hạt nhỏ được ẩn náu bên trong các hạt lớn. Sự phân cấp như vậy có thể được
biểu diễn đồ thị như một cây. Một nút không là lá của cây đa hạt biểu diễn dữ liệu
được kết hợp với con cháu của nó. Như một ví dụ minh hoạ, ta xét cây sau:
Nó gồm bốn mức nút. Mức cao nhất là toàn bộ CSDL. Thấp hơn là các nút
kiểu vùng: CSDL bao gồm các vùng này. Mỗi vùng lại có các nút kiểu file như các
con của nó, mỗi vùng chứa đúng các file này và không file nào nằm trong nhiều hơn
một vùng. Cuối cùng, mỗi file có các nút con kiểu mẩu tin, không mẩu tin nào hiện
diện trong hơn một file.
Mỗi nút trong cây có thể được chốt một các cá nhân. Như đã làm trong giao
thức chốt hai kỳ, ta sẽ sử dụng các phương thức chốt shared và exclusive . Khi một
giao dịch chốt một nút, trong phương thức shared hoặc exclusive, giao dịch cũng chốt
tất cả các nút con cháu của nút này ở cùng phương thức. Ví dụ Ti chốt tường minh
file Fb ở phương thức exclusive, nó đã chốt ẩn tất cả các mẩu tin của Fb cũng trong
phương thức exclusive.
Giả sử giao dịch Tj muốn chốt mẩu tin Rb6 của file Fb. vì giao địch Ti đã chốt
tường minh file Fb, mẩu tin Rb6 cũng bị chốt ẩn. Song làm thế nào để hệ thống biết
121
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
được Tj có thể chốt Rb6 hay không: Tj phải duyệt cây từ gốc đến mẩu tin Rb6, nếu có
một nút bất kỳ tren đường dẫn bị chốt ở phương thức không tương thích, Tj phải chờ.
Bây giờ, nếu Tk muốn chốt toàn bộ CSDL, nó phải chốt nút gốc. Tuy nhiên, do Ti
hiện đang giữ một chốt trên Fb, một bộ phận của cây, nên Tk sẽ không thành công.
Vậy làm thế nào để hệ có thể chốt được nút gốc: Một khả năng là tìm kiếm trên toàn
bộ cây, giải pháp này phá huỷ hoàn toàn sơ đồ mục đích của sơ đồ chốt đa hạt. Một
giải pháp hiệu quả hơn là đưa vào một lớp mới các phương thức chốt, được gọi là
phương thức chốt tăng cường (intension lock mode). Nếu một nút bị chốt ở phương
thức tăng cường, chốt tường minh được tiến hành ở mức thấp hơn của cây (hạt min
hơn). Chốt tăng cường được được đặt trên tất cả các tổ tiên của một nút trước khi nút
đó được chốt tường minh. Như vậy một giao dịch không cần thiết phải tìm kiếm toàn
bộ cây để xác định nó có thể chốt một nút thành công hay không. Một giao dịch
muốn chốt một nút, chẳng hạn Q, phải duyệt một đường dẫn từ gốc đến Q, trong khi
duyệt cây, giao dịch chốt các nút trên đường đi ở phương thức tăng cường.
Có một phương thức tăng cường kết hợp với phương thức shared và một với
phương thức exclusive. Nếu một nút bị chốt ở phương thức tăng cường shared (IS),
chốt tường minh được tiến hành ở mức thấp hơn trong cây, nhưng chỉ là một các chốt
phương thức shared. Tương tự, nếu một nút bị chốt ở phương thức tăng cường
exclusive (IX), chốt tường minh được tiến hành ở mức thấp hơn với các chốt
exclusive hoặc shared. Nếu một nút bị chốt ở phương thức shared và phương thức
tăng cường exclusive (SIX), cây con có gốc là nút này bị chốt tường minh ở phương
thức shared và chốt tường minh được tiến hành ở mức thấp hơn với các chốt
exclusive. Hàm tính tương thích đối với các phương thức chốt này cho bởi ma trận:
Giao thức chốt đa hạt dưới đây đảm bảo tính khả tuần tự. Mỗi giao địch T có
thể chốt một nút Q theo các quy tắc sau:
1. Hàm tương thích chốt phải được kiểm chứng
2. Gốc của cây phải được chốt đầu tiên, và có thể được chốt ở bất kỳ phương
122
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
thức nào .
3. Một nút Q có thể được chốt bởi T ở phương thức S hoặc IS chỉ nếu cha của
Q hiện đang bị chốt bởi T ở hoặc phương thức IX hoặc phương thức IS.
4. Một nút Q có thể được chốt bởi T ở phương thức X, SIX hoặc IX chỉ nếu
cha của Q hiện đang bị chốt ở hoặc phương thức IX hoặc phương thức SIX .
5. T có thể chốt một nút chỉ nếu trước đó nó chưa tháo chốt một nút nào.
6. T có thể tháo chốt một nút Q chỉ nếu không con nào của Q hiện đang bị
chốt bởi T. Ta thấy rằng giao thức đa hạt yêu cầu các chốt được tậu theo thứ tự Top-
Down, được tháo theo thứ tự Bottom-Up.
Ví dụ 6.2. Xét cây phân cấp hạt như trên và các giao dịch sau:
Giả sử giao dịch T18 đọc mẩu tin Ra2 của file Fa. Khi đó T18 cần phải chốt DB,
vùng A1 và Fa ở phương thức IS và Ra2 ở phương thức S: Lock-IS(DB); Lock-
IS(A1);Lock-IS(Fa); lock-S(Ra2)
Giả sử giao dịch T19 sửa đổi mẩu tin Ra9 trong file Fa , khi đó T19 cần phải chốt
CSDL, vùng A1 và file Fa ở phương thức IX và Ra9 ở phương thức X: Lock-IX(DB);
Lock-IX(A1); lock-IX(Fa); lock-X(Ra9)
Giả sử giao dịch T20 đọc tất cả các mẩu tin của file Fa , khi đó T20 cần phải
chốt CSDL, và vùng A1 ở phương thức IS và chốt Fa ở phương thức S: Lock-IS(DB);
Lock IS(A1); Lock-S(F=a)
Giả sử giao dịch T=21 đọc toàn bộ CSDL, nó có thể làm điều đó sau khi chốt
CSDL ở phương thức S: Lock-S(DB)
Chú ý rằng T18, T20 và T21 có thể truy xuất đồng thời CSDL, giao dịch T19 có
thể thực hiện cạnh tranh với T18 nhưng không với T20 hoặc T21.
5.2. Giao thức dựa trên tem thời gian
5.2.1. Tem thời gian
Ta kết hợp với mỗi giao dịch Ti trong hệ thống một tem thời gian cố định duy
nhất, được biểu thị bởi TS(Ti). Tem thời gian này được gán bởi hệ CSDL trước khi
giao dịch Ti bắt đầu thực hiện. Nếu một giao dịch Ti đã được gán tem thời gian
TS(Ti) và một giao dịch mới Tj đi vào hệ thống, khi đó TS(Ti) < TS(Tj). Có hai
phương pháp đơn giản để thực hiện sơ đồ này:
1. Sử dụng giá trị của đồng hồ hệ thống như tem thời gian: Một tem thời gian
của một giao dịch bằng giá trị của đồng hồ khi giao dịch đi vào hệ thống.
123
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
2. Sử dụng bộ đếm logic: bộ đếm được tăng lên mỗi khi một tem thời gian đã
được gán, tem thời gian của một giao dịch bằng với giá trị của bộ đếm khi giao dich
đi vào hệ thống. Tem thời gian của các giao dịch xác định thứ tự khả tuần tự. Như
vậy, nếu TS(Ti) < TS(Tj), hệ thống phải đảm bảo rằng lịch trình được sinh ra là tương
đương với một lịch trình tuần tự trong đó Ti xuất hiện trước Tj .
Để thực hiện sơ đồ này, ta kết hợp với mỗi hạng mục dữ liệu Q hai giá trị tem
thời gian:
- W-timestamp(Q) biểu thị tem thời gian lớn nhất của giao dịch bất kỳ đã thực
hiện Write(Q) thành công
- R-timestamp(Q) biểu thị tem thời gian lớn nhất của giao dịch bất kỳ đã thực
hiện Read(Q) thành công
Các tem thời gian này được cập nhật mỗi khi một Write hoặc một Read mới
được thực hiện.
5.2.2. Giao thức thứ tự tem thời gian
Giao thức thứ tự tem thời gian đảm bảo rằng các Write và Read xung đột bất
kỳ được thực hiện theo thứ tự tem thời gian. Giao thức này hoạt động như sau:
1. Giả sử giao dịch Ti phát ra Read(Q).
a. Nếu TS(Ti) < W-Timestamp(Q), Ti cần đọc một giá trị của Q đã được viết
rồi. Do đó, hoạt động Read bị vứt bỏ và Ti bị cuộn lại.
b. Nếu TS(Ti)≥ W-Timestamp(Q), hoạt động Read được thực hiện và R-
Timestamp được đặt bằng giá trị lớn nhất trong hai giá trị R-Timestamp
và TS(Ti).
2. Giả sử giao dịch Ti phát ra Write(Q).
a. Nếu TS(Ti) < R-Timestamp(Q), Giá trị của Q mà Ti đang sinh ra được giả
thiết là để được dùng cho các giao dịch đi sau nó (theo trình tự thời gian),
nhưng nay không cần đến nũa. Do vậy, hoạt động Write này bị vứt bỏ và Ti bị cuộn
lại
b. Nếu TS(Ti) < W-Timestamp(Q), Ti đang thử viết một giá trị đã quá hạn
của Q, Từ đó, hoạt động Write bị vứt bỏ và Ti bị cuộn lại
c. Ngoài ra, hoạt động Write được thực hiện và W-Timestamp(Q) được đặt là
TS(Ti) .
Một giao dịch Ti bị cuộn lại bởi sơ đồ điều khiển cạnh tranh như kết quả của
124
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
hoạt động Read hoặc Write đang được phát ra, được gán với một tem thời gian mới
và được tái khởi động lại (được xem như một giao dịch mới tham gia vào hệ thống) .
Ta xét các giao dịch T14 và T15 được xác định như dưới đây:
T14 : Read(B);
Read(A);
Display(A+B);
T15 : Read(B);
B:=B-50;
Write(B);
Read(A);
A:=A+50;
Write(A);
Display(A+B).
Ta giả thiết rằng một giao dịch được gán cho một tem thời gian ngay trước chỉ
thị đầu tiên của nó. Như vậy, lịch trình schedule-3 dưới đây có TS(T14) < TS(T15), và
là một lịch trình hợp lệ dưới giao thức tem thời gian:
Schedule-3
Giao thức thứ tự tem thời gian đảm bảo tính khả tuần tự xung đột và không
dealock.
5.2.3. Quy tắc viết Thomas
Một biến thể của giao thức tem thời gian cho phép tính cạnh tranh cao hơn
giao thức thứ tự tem thời gian. Trước hết ta xét lịch trình schedule-4 sau:
125
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Scheduele-4
Nếu áp dụng giao thức thứ tự tem thời gian, ta có TS(T16)< TS(T17). Hoạt
dộng Read(Q) của T16 và Write(Q) của T17 thành công, khi T16 toan thực hiện hoạt
động Write(Q) của nó, vì TS(T16) < TS(T17) = W-timestamp(Q), nên Write(Q) của
T16 bị vứt bỏ và giao dịch T16 bị cuộn lại. Sự cuộn lại này là không cần thiết. Nhận
xét này cho ta một sửa đổi phiên bản giao thức thứ tự tem thời gian: Các quy tắc giao
thức đối với Read không thay đổi, các quy tắc đối với Write được thay đổi chút ít như
sau: Giả sử giao dịch Ti phát ra Write(Q).
1. Nếu TS(Ti) < R-timestamp(Q), Giá trị của Q mà Ti đang sinh ra được giả
thiết là để được dùng cho các giao dịch đi sau nó (theo trình tự thời gian), nhưng nay
không cần đến nữa. Do vậy, hoạt động Write này bị vứt bỏ và Ti bị cuộn lại.
2. Nếu TS(Ti) < W-timestamp(Q), Ti đang thử viết một giá trị lỗi thời của Q.
Do vậy, hoạt động Write này có thể bị bỏ lơ (không được thực hiện, nhưng Ti không
bị cuộn lại).
3. Ngoài ra, hoạt động Write được thực hiện và W-timestamp(Q) được đặt là
TS(Ti). Sự sửa đổi đối với giao thức thứ tự tem thời gian này được gọi là quy tắc viết
Thomas. Quy tắc viết Thomas cho khả năng sinh các lịch trình khả tuần tự mà các
giao thức thức trước đây không thể.
5.2.4. Giao thức dựa trên tính hợp lệ
Trong trường hợp đa số các giao dịch trong hệ thống là các giao dịch chỉ đọc
(read-only), tỷ suất xung đột giữa các giao dịch là thấp. Như vậy nhiều giao dịch
trong chúng thực hiện thiếu sự giám sát của sơ đồ điều khiển cạnh tranh cũng vẫn giữ
cho hệ thống ở trạng thái nhất quán. Hơn nữa, một sơ đồ điều khiển cạnh tranh đưa
vào một tổng phí đáng kể (cho thực hiện mã lệnh, thời gian chờ của giao dịch ...).
Việc tìm một sơ đổ với tổng phí nhỏ là một mục tiêu. Nhưng khó khăn là ta phải biết
trước những giao dịch sẽ bị dính líu vào một xung đột. Để có được các hiểu bét đó, ta
cần một sơ đồ để giám sát hệ thống.
Ta giả thiết rằng mỗi giao dịch Ti , trong thời gian sống của nó, thực hiện
trong hai hoặc ba kỳ khác nhau, phụ thuộc vào nó là một giao dịch chỉ đọc hay là một
126
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
giao dịch cập nhật. Các kỳ này, theo thứ tự, là như sau:
1. Kỳ đọc. Trong kỳ này, các giá trị của các hạng mục dữ liệu khác nhau được
đọc vào các biến cục bộ của Ti . Tất cả các hoạt động Write được thực hiện trên các
biến cục bộ tạm, không cập nhật CSDL hiện hành.
2. Kỳ hợp lệ. Giao dịch Ti thực hiện một phép kiểm thử sự hợp lệ để xác định
xem nó có thể sao chép đến CSDL các biến cục bộ tạm chứa các kết quả của các hoạt
Write mà không vi phạm tính khả tuần tự xung đột hay không.
3. Kỳ viết. Nếu Ti thành công trong kỳ hợp lệ, các cập nhật hiện hành được áp
dụng vào CSDL, nếu không Ti bị cuộn lại. Mỗi giao dịch phải trải qua ba kỳ theo thứ
tự trên, tuy nhiên, ba kỳ của các giao dịch đang thực hiện cạnh tranh có thể đan xen
nhau.
Các kỳ đọc và kỳ viết tự nó đã rõ ràng. Chỉ có kỳ hợp lệ là cần thảo luận thêm.
Để thực hiện kiểm thử sự hợp lệ, ta cần biết khi nào các kỳ khác nhau của giao dịch
Ti xảy ra. Do vậy, ta sẽ kết hợp ba tem thời gian với giao dịch Ti :
1. Start(Ti). Thời gian khi Ti bắt đầu sự thực hiện.
2. Validation(Ti). Thời gian khi Ti kết thúc kỳ đọc và khởi động kỳ hợp lệ.
3. Finish(Ti). Thời gian khi Ti kết thúc kỳ viết.
Ta xác định thứ tự khả tuần tự bởi kỹ thuật thứ tự tem thời gian sử dụng giá trị
tem thời gian Validation(Ti). Như vậy, giá trị TS(Ti) = Validation(Ti) và nếu TS(Tj) <
TS(Tk) thì bất kỳ lịch trình nào được sinh ra phải tương đương với một lịch trình tuần
tự trong đó giao dịch Ti xuất hiẹn trước giao dịch Tk . Lý dota chọn Validation(Ti)
như tem thời gian của Ti , mà không chọn Start(Ti), là vì ta hy vọng thời gian trả lời
sẽ nhanh hơn.
Phép kiểm thử hợp lệ đối với Tj đòi hỏi rằng, đối với mỗi giao dịch Ti với
TS(Ti) < TS(Tj), một trong các điều kiện sau phải được thoả mãn:
1. Finish(Ti) < Start(Tj). Do Ti hoàn tất sự thực hiện của nó trước khi Tj bắt
đầu, thứ tự khả tuần tự được duy trì.
2. Tập các hạng mục dữ liệu được viết bởi Ti không giao với tập các hạng mục
dữ liệu được đọc bởi Tj và Ti hoàn tất kỳ viết của nó trước khi Tj bắt đầu kỳ
hợp lệ (Start(Tj) < Finish(Ti) < Validation(Tj)). Điều kiện này đảm bảo rằng các
viết của Ti và Tj là không chồng chéo. Do các viết của Ti không ảnh hưởng tới đọc
của Tj và do Tj không thể ảnh hưởng tới đọc của Ti , thứ tự khả tuần tự được duy trì.
Lịch trình schedule-5 cho ta một minh hoạ về giao thức dựa trên tính hợp lệ:
127
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Sơ đồ hợp lệ tự động canh chừng việc cuộn lại hàng loạt, do các Write hiện tại
xảy ra chỉ sau khi giao dịch phát ra Write đã bàn giao.
5.3. Các sơ đồ đa phiên bản
Các sơ đồ điều khiển cạnh tranh được thảo luận trước đây đảm bảo tính khả
tuần tự hoặc bởi làm trễ một hoạt động hoặc bỏ dở giao dịc đã phát ra hoạt động đó.
Chẳng hạn, một hoạt động Read có thể bị làm trễ vì giá trị thích hợp còn chưa được
viết hoặc nó có thể bị vứt bỏ vì giá trị mà nó muốn đọc đã bị viết đè rồi. Các khó
khăn này có thể được che đi nếu bản sao cũ của mỗi hạng mục dữ liệu được giữ trong
một hệ thống.
Trong các hệ CSDL đa phiên bản, mỗi hoạt động Write(Q) tạo ra một bản mới
của Q. Khi một hoạt động Read(Q) được phát ra, hệ thống chọn lựa một trong các
phiên bản của Q để đọc. Sơ đồ điều khiển cạnh tranh phải đảm bảo rằng việc chọn
lựa này được tiến hành sao cho tính khả tuần tự được đảm bảo. Do lý do hiệu năng,
một giao dịch phải có khả năng xác định dễ dàng và mau chóng phiên bản dhạng mục
dữ liệu sẽ đọc.
5.3.1. Thứ tự tem thời gian đa phiên bản
Kỹ thuật chung được dùng trong các sơ đồ đa phiên bản là tem thời gian. Ta
kết hợp với một giao dịch một tem thời gian tĩnh duy nhất, ký hiệu TS(Ti). Tem thời
gian này được gán trước khi khi giao dịch bắt đầu sự thực hiện. Mỗi hạng mục dữ
liệu Q kết hợp với một dãy < Q1, Q2, ... , Qm > mỗi phiên bản Qk chứa ba trường dữ
liệu:
128
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
- Content là giá trị của phiên bản Qi
- W-timestamp(Qk) là tem thời gian của giao dịch đã tạo ra phiên bản Qk
- R-timestamp(Qk) là tem thời gian lớn nhất của giao dịch đã đọc thành công
phiên bản Qk .Một giao dịch, gọi là Ti , tạo ra phiên bản Qk của hạng mục dữ liệu Q
bằng cách phát ra một hoạt động Write(Q). Trường Content của phiên bản chứa giá
trị được viết bởi Ti. Wtimestamp và R-timestamp được khởi động là TS(Ti). Giá trị
R-timestamp được cập nhật mỗi khi một giao dịch Tj đọc nội dung của Qk và R-
timestamp(Qk) < TS(Tj).
Sơ đồ tem thời gian đa phiên bản dưới đây sẽ đảm bảo tính khả tuần tự. Sơ đồ
hoạt động như sau: giả sử Tj phát ra một hoạt động Read(Q) hoặc Write(Q). Qk ký
hiệu phiên bản của Q, tem thời gian viết của nó là tem thời gian viết lớn nhất nhỏ hơn
hoặc bằng TS(Tj).
1. Nếu giao dịch Tj phát ra một Read(Q), khi đó giá trị trả lại là nội dung của
phiên bản Qk.
2. Nếu Tj phát ra một Write(Q) và nếu TS(Tj) < R-timestamp(Qk) khi đó giao
dịch Tj bị cuộn lại. Nếu không, nếu TS(Tj) = W-timestamp(Qk) nội dung của Qk bị
viết đè, khác đi một phiên bản mới của Q được tạo.
Các phiên bản không còn được dùng đến nữa bị xoá đi dựa trên quy tắc sau:
Giả sử có hai phiên bản Qi và Qj của một hạng mục dữ liệu và cả hai phiên bản này
cùng có Wtimestamp nhỏ hơn tem thời gian của giao dịch già nhất trong hệ thống,
khi đó phiên bản già hơn trong hai phiên bản Qi và Qj sẽ không còn được dùng nữa
và bị xoá đi.
Sơ đồ thứ tự tem thời gian đa phiên bản có tính chất hay đó là một yêu cầu
Read không bao giờ thất bại và không phải chờ đợi. Trong một hệ thống mà hoạt
động Read xảy ra nhiều hơn Write cái lợi này là đáng kể. Tuy nhiên có vài điều bất
lợi của sơ đồ này là: thứ nhất đọc một hạng mục dữ liệu cũng đòi hỏi cập nhật trường
R-timestamp, thứ hai là xung đột giữa các giao dịch được giải quyết bằng cuộn lại.
5.3.2. Chốt hai kỳ đa phiên bản
Giao thức chốt hai kỳ đa phiên bản cố gắng tổ hợp những ưu điểm của điều
khiển cạnh tranh với các ưu điểm của chốt hai kỳ. Giao thức này phân biệt các giao
dịch chỉ đọc và các giao dịch cập nhật.
Các giao dịch cập nhật thực hiện chốt hai kỳ nghiêm khắc (các chốt được giữ đến tận
khi kết thúc giao dịch). Mỗi hạng mục dữ liệu có một tem thời gian. Tem thời gian
129
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
trong trường hợp này không là tem thời gian dựa trên đồng hồ thực mà là một bộ
đếm, sẽ được gọi là TScounter.
Các giao dịch chỉ đọc được gán tem thời gian là giá trị hiện hành của TS-
counter trước khi chúng bắt đầu sự thực hiện: chúng tuân theo giao thức thứ tự tem
thời gian đa phiên bản để thực hiện đọc. Như vậy, khi một giao dịch chỉ đọc Ti phát
ra một Read(Q), giá trị trả lại là nội dung của phiên bản mà tem thời gian của nó là
tem thời gian lớn nhất nhỏ hơn TS(Ti).
Khi một giao dịch cập nhật đọc một hạng mục, nó tậu một chốt shared trên
hạng mục, rồi đọc phiên bản mới nhất của hạng mục (đối với nó). Khi một giao dịch
cập nhật muốn viết một hạng mục, đầu tiên nó tậu một chốt exclusive trên hạng mục
này, rồi tạo ra một phiên bản mới cho hạng mục. Write được thực hiện trên phiên bản
mới này và tem thời gian của phiên bản mới được khởi động là +∞.
Khi một giao dịch cập nhật Ti hoàn tất các hoạt động của nó, nó thực hiện xử
lý bàn giao như sau: Đầu tiên, Ti đặt tem thời gian trên mỗi phiên bản nó đã tạo là
TS-counter+1; sau đó Ti tăng TS-counter lên 1. Chỉ một giao dịch cập nhật được
phép thực hiện xử lý bàn giao tại một thời điểm.
Các phiên bản bị xoá cùng kiểu cách với thứ tự tem thời gian đa phiên bản.
5.4. Quản trị Deadlock
Một hệ thống ở trạnh thái deadlock nếu tồn tại một tập hợp các giao dịch sao
cho mỗi giao dịch trong tập hợp đang chờ một giao dịch khác trong tạp hợp. Chính
xác hơn, tồn tại một tập các giao dịch { T0 , T2 , ..., Tn } sao cho T0 đang chờ một
hạng mục dữ liệu được giữ bởi T1 , T1 đang chờ một hạng mục dữ liệu đang bị chiếm
bởi T2 , ..., Tn-1 đang chờ một hạng mục dữ liệu được giữ bởi Tn và Tn đang chờ một
hạng mục T0 đang chiếm. Không một giao dịch nào có thể tiến triển được trong tình
huống như vậy. Một cách chữa trị là viện dẫn một hành động tẩy rửa, chẳng hạn cuộn
lại một vài giao dịch tham gia vào deadlock.
Có hai phương pháp chính giải quyết vấn đề deadlock: Ngăn ngừa deadlock,
phát hiện deadlock và khôi phục. Giao thức ngăn ngừa deadlock đảm bảo rằng hệ
thống sẽ không bao giờ đi vào trạng thái deadlock. Sơ đồ phát hiện deadlock và khôi
phục (deadlock-detection and deadlock-recovery scheme) cho phép hệ thống đi vào
trạng thái deadlock và sau đó cố gắng khôi phục. Cả hai phương pháp đều có thể dẫn
đến việc cuộn lại giao dịch. Phòng ngừa deadlock thường được sử dụng nếu xác suất
hệ thống đi vào deadlock cao, phát hiện và khôi phục hiệu quả hơn trong các trường
130
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
hợp còn lại.
5.4.1. Phòng ngừa deadlock
Có hai cách tiếp cận phòng ngừa deadlock: Một đảm bảo không có chờ đợi
vòng tròn xảy ra bằng cách sắp thứ tự các yêu cầu chốt hoặc đòi hỏi tất cả các chốt
được tậu cùng nhau. Một cách tiếp cận khác gần hơn với khắc phục deadlock và thực
hiện cuộn lại thay vì chờ đợi một chốt. Chờ đợi là tiểm ẩn của deadlock.
Sơ đồ đơn giản nhất dưới cách tiếp cận thứ nhất đòi hỏi mỗi giao dịch chốt tất
cả các hạng mục dữ liệu trước khi nó bắt đầu thực hiện. Hơn nữa, hoặc tất cả được
chốt trong một bước hoặc không hạng mục nào được chốt. Giao thức này có hai bất
lợi chính: một là khó dự đoán, trước khi giao dịch bắt đầu, các hạng mục dữ liệu nào
cần được chốt, hai là hiệu suất sử dụng hạng mục dữ liệu rất thấp do nhiều hạng mục
có thể bị chốt nhưng không được sử dụng trong một thời gian dài.
Sơ đồ phòng ngừa deadlock khác là áp đặt một thứ tự bộ phận trên tất cả các
hạng mục dữ liệu và yêu cầu một giao dịch chốt một hạng mục dữ liệu theo thứ tự
được xác định bởi thứ tự bộ phận này.
Cách tiếp cận thứ hai để phòng ngừa deadlock là sử dụng ưu tiên và cuộn lại
quá trình. Với ưu tiên, một giao dịch T2 yêu cầu một chốt bị giữ bởi giao dịch T1 ,
chốt đã cấp cho T1 có thể bị lấy lại và cấp chgo T2 , T1 bị cuộn lại. Để điều khiển ưu
tiên, ta gán một tem thời gian duy nhất cho mỗi giao dịch. Hệ thống sử dụng các tem
thời gian này để quyết định một giao dịch phải chờ hay cuộn lại. Việc chốt vẫn được
sử dụng để điều khiển cạnh tranh. Nếu một giao dịch bị cuộn lại, nó vẫn giữ tem thời
gian cũ của nó khi tái khởi động. Hai sơ đồ phòng ngừa deadlock sử dụng tem thời
gian khác nhau được đề nghị:
1. Sơ đồ Wait-Die dựa trên kỹ thuật không ưu tiên. Khi giao dịch Ti yêu cầu
một hạng mục dữ liệu bị chiếm bởi Tj , Ti được phép chờ chỉ nếu nó có tem thời gian
nhỏ hơn của Tj nếu không Ti bị cuộn lại (die).
2. Sơ đồ Wound-Wait dựa trên kỹ thuật ưu tiên. Khi giao dịch Ti yêu cầu một
hạng mục dữ liệu hiện đang bị giữ bởi Tj , Ti được phép chờ chỉ nếu nó có tem thời
gian lớn hơn của Tj , nếu không Tj bị cuộn lại (Wounded).
Một điều quan trọng là phải đảm bảo rằng, mỗi khi giao dịch bị cuộn lại, nó
không bị chết đói (starvation) có nghĩa là nó sẽ không bị cuộn lại lần nữa và được
phép tiến triển. Cả hai sơ đồ Wound-Wait và Wait-Die đều tránh được sự chết đói: tại
một thời điểm, có một giao dịch với tem thời gian nhỏ nhất. Giao dịch này không thể
131
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
bị yêu cầu cuộn lại trong cả hai sơ đồ. Do tem thời gian luôn tăng và do các giao dịch
không được gán tem thời gian mới khi chúng bị cuộn lại, một giao dịch bị cuộn lại sẽ
có tem thời gian nhỏ nhất (vào thời gian sau) và sẽ không bị cuộn lại lần nữa. Tuy
nhiên, có những khác nhau lớn trong cách thức hoạt động của hai sơ đồ:
- Trong sơ đồ Wait-Die, một giao dịch già hơn phải chờ một giao dịch trẻ hơn
giải phóng hạng mục dữ liệu. Như vậy, giao dịch già hơn có xu hướng bị chờ nhiều
hơn. Ngược lại, trong sơ đồ Wound-Wait, một giao dịch già hơn không bao giờ phải
chờ một giao dịch trẻ hơn.
- Trong sơ đồ Wait-Die, nếu một giao dịch Ti chết và bị cuộn lại vì nó đòi hỏi
một hạng mục dữ liệu bị giữ bởi giao dịch Tj , khi đó Ti có thể phải tái phát ra cùng
dãy các yêu cầu khi nó khởi động lại. Nếu hạng mục dữ liệu vẫn bị chiếm bởi Tj , Ti
bị chết lần nữa. Như vậy, Ti có thể bị chết vài lần trước khi tậu được hạng mục dữ
liệu cần thiết. Trong sơ đồ Wound-Wait, Giao dịch Ti bị thương và bị cuộn lại do
Tj yêu cầu hạng mục dữ liệu nó chiếm giữ. Khi Ti khởi động lại, và yêu cầu hạng
mục dữ liệu, bây giờ, đang bị Tj giữ, Ti chờ. Như vậy, có ít cuộn lại hơn trong sơ đồ
Wound-Wait. Một vấn đề nổi trội đối với cả hai sơ đồ là có những cuộn lại không cần
thiết vẫn xảy ra.
5.4.2. Sơ đồ dựa trên timeout
Một cách tiếp cận khác để quản lý deadlock được dựa trên lock timeout. Trong
cách tiếp cận này, một giao dịch đã yêu cầu một chốt phải chờ nhiều nhất một
khoảng thời gian xác định. Nếu chốt không được cấp trong khoảng thời gian này,
giao dịch được gọi là mãn kỳ (time out), giao dịch tự cuộn lại và khởi động lại. Nếu
có một deadlock, một hoặc một vài giao dịch dính líu đến deadlock sẽ time out và
cuộn lại, để các giao dịch khác tiến triển. Sơ đồ này nằm trung gian giữa phòng ngừa
deadlock và phát hiện và khôi phục deadlock.
Sơ đồ timeout dễ thực thi và hoạt động tốt nếu giao dịch ngắn và nếu sự chờ
đợi lâu là do deadlock. Tuy nhiên, khó quyết định được khoảng thời gian timeout. Sơ
đồ này cũng có thể đưa đến sự chết đói.
5.4.3. Phát hiện deadlock và khôi phục
Nếu một hệ thống không dùng giao thức phòng ngừa deadlock, khi đó sơ đồ
phát hiện và khôi phục phải được sử dụng. Một giải thuật kiểm tra trạng thái của hệ
thống được gọi theo một chu kỳ để xác định xem deadlock có xẩy ra hay không. Nếu
có, hệ thống phải khôi phục lại từ deadlock, muốn vậy hệ thống phải:
132
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
- Duy trì thông tin về sự cấp phát hiện hành các hạng mục dữ liệu cho các giao
dịch cũng như các yêu cầu hạng mục dữ liệu chưa được chưa được giải quyết.
- Cung cấp một thuật toán sử dụng các thông tin này để xác định hệ thống đã
đi vào trạng thái deadlock chưa.
- Phục hồi từ deadlock khi phát hiện được deadlock đã xảy ra.
a. Phát hiện deadlock
Deadlock có thể mô tả chính xác bằng đồ thị định hướng được gọi là đồ thị
chờ (wait for graph). Đồ thị này gồm một cặp G = < V, E >, trong đó V là tập các
đỉnh và E là tập các cung. Tập các đỉnh gồm tất cả các giao dịch trong hệ thống. Mỗi
phần tử của E là một cặp Ti → Tj , nó chỉ ra rằng Ti chờ Tj giải phóng một hạng mục
dữ liệu nó cần.
Khi giao dịch Ti yêu cầu một hạng mục dữ liệu đang bị giữ bởi giao dịch Tj
khi đó cung Ti → Tj được xen vào đồ thị. Cạnh này bị xoá đi chỉ khi giao dịch Tj
không còn giữ hạng mục dữ liệu nào mà Ti cần. Deadlock tồn tại trong hệ thống nếu
và chỉ nếu đồ thị chờ chứa một chu trình. Mỗi giao dịch tham gia vào chu trình này
được gọi là bị deadlock. Để phát hiện deadlock, hệ thống phải duy trì đồ thị chờ và
gọi theo một chu kỳ thủ tục tìm kiếm chu trình. Ta xét ví dụ sau:
Đồ thị chờ (phi chu trình)
Do đồ thị không có chu trình nên hệ thống không trong trạng thái deadlock.
Bây giờ, giả sử T28 yêu cầu một hạng mục dữ liệu được giữ bởi T27, cung T28 → T27
được xen vào đồ thị, điều này dẫn đến tồn tại một chu trình T26 → T27 → T28 → T26
có nghĩa là hệ thống rơi vào tình trạng deadlock và T26, T27, T28 bị deadlock.
133
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Vấn đề đặt ra là khi nào thì chạy thủ tục phát hiện ? câu trả lời phụ thuộc hai
yêu tố sau:
1. Deadlock thường xảy ra hay không ?
2. Bao nhiêu giao dịch sẽ bị ảnh hưởng bởi deadlock
Nếu deadlock thường xảy ra, việc chạy thủ tục phát hiện diễn ra thường xuyên
hơn. Các hạng mục dữ liệu được cấp cho các giao dịch bị deadlock sẽ không sẵn
dùng cho các giao dịch khác đến khi deadlock bị phá vỡ. Hơn nữa, số chu trình trong
đồ thị có thể tăng lên. Trong trường hợp xấu nhất, ta phải gọi thủ tục phát hiện mỗi
khi có một yêu cầu cấp phát không được cấp ngay.
b. Khôi phục từ deadlock
Khi thuật toán phát hiện xác định được sự tồn tại của deadlock, hệ thống phải
khôi phục từ deadlock. Giải pháp chung nhất là cuộn lại một vài giao dịch để phá vỡ
deadlock. Ba việc cần phải làm là:
1. Chọn nạn nhân. Đã cho một tập các giao dịch bị deadlock, ta phải xác định
giao dịch nào phải cuộn lại để phá vỡ deadlock. Ta sẽ cuộn lại các giao dịch sao cho
giá phải trả là tối thiểu. Nhiều nhân tố xác định giá của cuộn lại:
a. Giao dịch đã tính toán được bao lâu và bao lâu nữa.
b. Giao dịch đã sử dụng bao nhiêu hạng mục dữ liệu
c. Giao dịch cần bao nhiêu hạng mục dữ liệu nữa để hoàn tất.
d. Bao nhiêu giao dịch bị cuộn lại.
2. Cuộn lại (Rollback). Mỗi khi ta đã quyết định được giao dịch nào phải bị
cuộn lại, ta phải xác định giao dịch này bị cuộn lại bao xa. Giải pháp đơn giản nhất
là cuộn lại toàn bộ: bỏ dở giao dịch và bắt đầu lại nó. Tuy nhiên, sẽ là hiệu quả hơn
nếu chỉ cuộn lại giao dịch đủ xa như cần thiết để phá vỡ deadlock. Nhưng phương
pháp này đòi hỏi hệ thống phải duy trì các thông tin bổ xung về trạng thái của tất cả
các giao dịch đang chạy.
3. Sự chết đói (Starvation). Trong một hệ thống trong đó việc chọn nạn nhân
134
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
dựa trên các nhân tố giá, có thể xảy ra là một giao dịch luôn là nạn nhân của việc
chọn này và kết quả là giao dịch này không bao giờ có thể hoàn thành. Tình huống
này được gọi là sự chết đói. Phải đảm bảo việc chọn nạn nhân không đưa đến chết
đói. Một giải pháp xem số lần bị cuộn lại của một giao dịch như một nhân tố về giá.
135
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
Câu hỏi
1. Chứng tỏ rằng giao thức chốt hai kỳ đảm bảo tính khả tuần tự xung đột và các
giao dịch có thể được làm tuần tự tương ứng với các điểm chốt của chúng.
2. Xét hai giao dịch sau:
T31 : Read(A);
Read(B);
If A=0 then B:=B+1;
Write(B);
T32 : Read(B);
Read(A);
If B=0 then A:=A+1;
Write(A);
Thêm các chỉ thị chốt và tháo chốt vào hai giao dịch T31 và T32 sao cho
chúng tuân theo giao thức chốt hai kỳ. Sự thực hiện các giao dịch này có thể dẫn đến
deadlock không?
3. Nêu các ưu điểm và nhược điểm của giao thức chốt hai kỳ nghiêm ngặt.
4. Nêu các ưu điểm và nhược điểm của giao thức chốt hai kỳ nghiêm khắc.
5. Bộ quản trị điều khiển cạnh tranh của một hệ CSDL phải quyết định cấp cho một
đòi hỏi chốt hoặc bắt giao dịch yêu cầu phải chờ. Hãy thiết kế một cấu trúc dữ liệu
(tiết kiệm không gian ) cho phép bộ quản trị điều khiển cạnh tranh cho ra quyết định
mau chóng.
6. Xét sự mở rộng thành giao thức cây-chốt sau. Nó cho phép cả chốt shared và
exclusive:
• Một giao dịch chỉ đọc chỉ có thể yêu cầu các chốt shared. Một giao dịch
cập nhật chỉ có thể yêu cầu các chốt exclusive
• Mỗi giao dịch phải tuân theo các quy tắc của giao thức cây-chốt. Các giao
dịch chỉ đọc đầu tiên có thể chốt bất kỳ hạng mục dữ liệu nào, các giao dịch cập nhật
đầu tiên phải chốt gốc.
Chứng tỏ giao thức đảm bảo tính khả tuần tự và không có deadlock
7. Xét một biến thể của giao thức cây, được gọi là giao thức rừng. CSDL được tổ
chức như một rừng. Mỗi giao dịch T phải tuân theo các quy tắc sau:
136
Phần 1: Nguyên lý các hệ quản trị cơ sở dữ liệu
• Chốt đầu tiên trong mỗi cây có thể trên bất kỳ hạng mục dữ liệu nào
• Chốt từ thứ hai trở về sau có thể được yêu cầu chỉ nếu cha của nút được
yêu cầu hiện đang bị chốt
• Các hạng mục dữ liệu có thể được tháo chốt bất kỳ lúc nào
• Một hạng mục dữ liệu không được chốt lại bởi T sau khi T đã tháo chốt
cho nó
Chứng tỏ giao thức rừng không đảm bảo tính khả tuần tự
8. Trong chốt đa hạt, sự khác nhau giữa chốt tường minh và chốt ẩn là gì ?
9. Phương thức chốt SIX là hữu dụng trong chốt đa hạt. Phương thức exclusive và
shared tăng cường không được sử dụng. Tại sao nó lại vô dụng ?
10. Đối với mỗi một trong các giao thức sau, mô tả sắc thái ứng dụng thực tế gợi ý sử
dụng giao thức và sắc thái gợi ý không nên sử dụng giao thức:
• Chốt hai kỳ
• Chốt hai kỳ với chốt đa hạt
• Giao thức cây
• Thứ tự tem thời gian
• Hợp lệ
• Thứ tự tem thời gian đa phiên bản
• Chốt hai kỳ đa phiên bản
11. Chứng tỏ rằng có những lịch trình là có thể dưới giao thức chốt hai kỳ nhưng
không thể dưới giao thức tem thời gian và ngược lại.
12. Với điều kiện nào tránh deadlock ít đắt giá hơn cho phép deadlock rồi phát hiện?
137
Bạn đang đọc truyện trên: AzTruyen.Top