Tải bản đầy đủ (.pdf) (96 trang)

Quản lý giao tác trong CSDL quan hệ và phân tán

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (977.2 KB, 96 trang )

ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƢỜNG ĐẠI HỌC CÔNG NGHỆ






Nguyễn Văn Dƣơng






QUẢN LÝ GIAO TÁC TRONG CSDL
QUAN HỆ VÀ PHÂN TÁN











LUẬN VĂN THẠC SĨ












Hà Nội - 2008
ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƢỜNG ĐẠI HỌC CÔNG NGHỆ






Nguyễn Văn Dƣơng






QUẢN LÝ GIAO TÁC TRONG CSDL
QUAN HỆ VÀ PHÂN TÁN




Ngành : Công nghệ thông tin
Mã số : 1. 01. 10


LUẬN VĂN THẠC SĨ


NGƯỜI HƯỚNG DẪN KHOA HỌC:
TS. Nguyễn Tuệ











Hà Nội – 2008

1
MỤC LỤC

MỞ ĐẦU 5
CHƢƠNG 1: GIỚI THIỆU VỀ XỬ LÝ GIAO TÁC 7
1.1 Giới thiệu về xử lý giao tác 7
1.1.1 Hệ thống đơn người dùng và đa người dùng 7
1.1.2 Các giao tác, các thao tác Đọc và Ghi, vùng đệm DBMS 8

1.1.3 Vì sao điều khiển đồng thời là cần thiết 12
1.1.4 Tại sao khôi phục là cần thiết 16
1.2 Các khái niệm hệ thống và giao tác 17
1.2.1 Các trạng thái giao tác và các thao tác bổ sung 17
1.2.2 File log hệ thống (the system log) 19
1.2.3 Điểm xác định hoàn thành của giao tác 20
1.3 Các đặc trƣng của giao tác 21
1.4. Lịch biểu và khả năng phục hồi 23
1.4.1 Lịch biểu của các giao tác 23
1.4.2 Đặc điểm của lịch biểu dựa trên khả năng phục hồi 26
1.5 Thứ tự của lịch biểu 29
1.5.1 Lịch biểu có thứ tự, không có thứ tự và lịch biểu có thứ tự xung đột 30
1.5.2 Kiểm tra thứ tự xung đột của một lịch biểu 35
1.5.3 Sử dụng tính thứ tự 39
1.5.4 Tương đương khung nhìn và tính sắp thứ tự được khung nhìn 41
1.6 Các kiểu tƣơng đƣơng khác của các lịch biểu 42
CHƢƠNG 2: CÁC KỸ THUẬT ĐIỀU KHIỂN ĐỒNG THỜI 44
2.1 Kỹ thuật sử dụng khóa cho điều khiển đồng thời 44
2.1.1 Bảng khoá hệ thống và bảng các loại khóa 45
2.1.2 Khóa 2 kỳ (Two - phase locking) 59
2.1.3 Khóa chết và xử lý khóa chết 61
2.2 Điều khiển đồng thời dựa vào Timestamps Ordering 69
2.2.1 Tem thời gian (Timestamps) 70

2
2.2.2 Thuật toán Timestamp Ordering 70
2.3 Các kỹ thuật điều khiển đồng thời đa phiên bản 73
2.3.1 Kỹ thuật đa phiên bản dựa trên Timestamp Ordering 74
2.3.2 Khóa 2 kỳ sử dụng khóa chứng thực 75
2.4 Các kỹ thuật điều khiển đồng thời dựa trên tính hợp lệ 77

2.5 Đa hạt (Multiple Granularity) 80
CHƢƠNG 3: QUẢN LÝ GIAO TÁC TRONG SQL 84
3.1 Xếp hàng thứ tự 85
3.2 Tính nguyên tử 87
3.3 Giao tác chỉ đọc 88
3.4 Vấn đề Dirty Read 88
3.4.1 Dirty read không gây nguy hiểm 89
3.4.2 Dirty read có thể gây nguy hiểm 90
KẾT LUẬN 92
TÀI LIỆU THAM KHẢO 94















3


CÁC THUẬT NGỮ VIẾT TẮT




2PL Two - Phase Locking
ACID Atomicity, Consistency, Isolation, Durability
CSDL Cơ sở dữ liệu
DBMS Database Management System
HQTCSDL Hệ quản trị cơ sở dữ liệu
OLTP Online Transaction Processing
SQL Structured Query Languege
TO Timestamp Ordering































4
DANH MỤC CÁC BẢNG BIỂU, HÌNH MINH HỌA



Hình 1.1 Xử lý đan xen và xử lý song song của giao tác đồng thời 8
Hình 1.2 Hai giao tác mẫu, Giao tác T
1
và Giao tác T
2
12
Hình 1.3 Một số vấn đề xuất hiện khi thực thi đồng thời không có điều khiển 14
Hình 1.4 Sơ đồ chuyển trạng thái thực thi giao tác 19
Hình 1.5 Lịch biểu tuần tự và không tuần tự 29
Hình 1.6: Hai lịch biểu cho kết quả tương đương với X = 100 33
Hình 1.7 Xây dựng đồ thị ưu tiên cho lịch biểu A tới D (hình 1.5) để kiểm tra
thứ tự xung đột. 36
Hình 1.8 Ví dụ phân tích khả năng tuần tự. 39
Hình 1.8: (d) Đồ thị của lịch biểu E; (e) Đồ thị của lịch biểu F 39
(f) Đồ thị với 2 lịch biểu tuần tự tương đương 40

Hình 2.1: Các thao tác khóa và mở khóa đối với khóa nhị phân 47
Hình 2.2 Thao tác khóa và mở khóa đối với 2 chế độ khóa shared/exclusive 51
Hình 2.3 Giao tác không tuân theo khóa 2 kỳ 59
Hình 2.4 Minh họa vấn đề khóa chết 64
Hình 2.5 Đồ thị chờ (Phi chu trình) 69
Hình 2.6 Các bảng khóa tương thích 79
Hình 2.7 Ma trận khóa tương thích đối với khóa đa hạt 84














5
MỞ ĐẦU

Ngày nay việc ứng dụng các hệ cơ sở dữ liệu vào các lĩnh vực hoạt động
của xã hội đã trở thành phổ biến. Để khai thác tốt các CSDL cần phải có các
hệ QTCSDL tốt. Ngoài các chức năng như định nghĩa, cập nhật và truy vấn
cơ sở dữ liệu, các hệ QTCSDL phải làm tốt việc quản lý các giao tác, nhất là
trong môi trường đa chương trình, nhằm đảm bảo tính nhất quán của cơ sở dữ
liệu.

Ở nước ta, việc sử dụng các hệ QTCSDL là phổ biến nhưng việc nghiên
cứu các kỹ thuật trong việc xây dựng các hệ QTCSDL chưa được thực hiện
nhiều. Luận văn nhằm nghiên cứu về các giao tác và quản lý giao tác trong
các hệ QTCSDL. Môi trường được lựa chọn là các hệ thống đa chương trình
xử lý các giao tác đồng thời. Đây là một vấn đề có ý nghĩa lý thuyết và thực
tiễn, giúp việc khai thác các CSDL được đúng đắn.
Luận văn bao gồm phần mở đầu, ba chương nội dung và phần kết luận.
Chương 1 “GIỚI THIỆU VỀ XỬ LÝ GIAO TÁC” trình bày khái niệm về
giao tác được sử dụng để biểu diễn một đơn vị logic xử lý cơ sở dữ liệu phải
được hoàn thành trọn vẹn để đảm bảo tính đúng đắn, thảo luận vấn đề kiểm
soát đồng thời xuất hiện khi nhiều giao tác được đệ trình cùng một lúc có thể
gây trở ngại lẫn nhau dẫn đến việc sinh ra các kết quả sai và vấn đề khôi phục
từ các giao tác bị hỏng. Chương 2 “CÁC KỸ THUẬT ĐIỀU KHIỂN ĐỒNG
THỜI ” sẽ trình bày các công nghệ liên quan đến việc điều khiển trong các
quá trình truy cập cơ sở dữ liệu. Chương 3 “QUẢN LÝ GIAO TÁC TRONG
SQL” sẽ mô tả việc thể hiện các giao tác SQL thông qua một số chương trình
cụ thể. Cuối cùng là phần kết luận tổng kết lại những gì đã làm được trong
luận văn, hướng phát triển của luận văn.

6
Cuối cùng tác giả xin bày tỏ lòng biết ơn chân thành tới TS. Nguyễn
Tuệ, thầy đã luôn ân cần, chỉ bảo, động viên, giúp đỡ tác giả trong suốt quá
trình thực hiện luận văn. Tác giả xin chân thành cảm ơn gia đình, bạn bè,
đồng nghiệp đã luôn động viên và giúp đỡ về nhiều mặt trong thời gian qua,
xin chân thành cảm ơn các thầy cô giáo Trường Đại học Công nghệ và Khoa
sau đại học đã tạo điều kiện giúp đỡ để tác giả hoàn thành Luận văn này.



















7
CHƢƠNG 1: GIỚI THIỆU VỀ XỬ LÝ GIAO TÁC
1.1 Giới thiệu về xử lý giao tác
Trong phần này sẽ giới thiệu các khái niệm của các giao tác thực thi
đồng thời và cách khôi phục lại do các giao tác lỗi.
1.1.1 Hệ thống đơn người dùng và đa người dùng
Một tiêu chuẩn để phân loại một hệ cơ sở dữ liệu đó là dựa vào số lượng
người dùng có thể truy cập vào hệ thống tại cùng một thời điểm. Hệ quản trị
cơ sở dữ liệu (DBMS - Database Management System) là đơn người dùng
(single-user) nếu tại một thời điểm chỉ có một người dùng truy cập hệ thống
và là đa người dùng (multi-user) nếu có nhiều người dùng có thể truy cập hệ
thống một cách đồng thời. Ví dụ: Hệ thống đặt vé máy bay được sử dụng
đồng thời bởi hàng trăm đại lý bán vé. Các hệ thống trong các nhà băng, các
hãng bảo hiểm, các sở giao dịch chứng khoán và các hệ thống khác tương tự
đều được nhiều người sử dụng đệ trình các giao tác một cách đồng thời [1].
Nhiều người dùng sử dụng các hệ thống máy tính có thể truy cập các cơ

sở dữ liệu cùng một lúc là do khái niệm đa chương trình, nó cho phép máy
tính thực thi nhiều chương trình -hoặc tiến trình- tại cùng một thời điểm. Nếu
chỉ có 1 bộ xử lý trung tâm (CPU), trên thực tế nó chỉ có thể thực thi nhiều
nhất 1 xử lý tại một thời điểm. Tuy nhiên, các hệ điều hành đa chương trình
thực thi một số câu lệnh của một tiến trình, sau đó hoãn tiến trình đó lại và
thực thi một số câu lệnh của tiến trình tiếp theo và v v. Một tiến trình sẽ lại
được tiếp tục tại điểm mà nó bị hoãn khi đến lượt nó được sử dụng CPU lại.
Như vậy, việc thực hiện đồng thời của các tiến trình thực chất là sự đan xen,
như minh họa ở hình 1.1, chỉ ra 2 tiến trình A và B được thực hiện một các
đồng thời theo cách đan xen. Sự đan xen giữ gìn sự bận rộn của CPU khi một

8
tiến trình đòi hỏi một thao tác vào hoặc ra, chẳng hạn như việc đọc một khối
dữ liệu từ đĩa [1].
Nếu hệ thống máy tính có nhiều bộ xử lý (nhiều CPU), việc xử lý song
song của nhiều tiến trình có thể thực hiện được, như minh họa trong hình 1.1
với các tiến trình C và D [1].
Trong DBMS đa người dùng, các mục dữ liệu được lưu trữ là nguồn tài
nguyên chính cho các chương trình ứng dụng hoặc người sử dụng tương tác
truy cập đồng thời để liên tục lấy thông tin từ cơ sở dữ liệu và thay đổi cơ sở
dữ liệu [1].







Hình 1.1 Xử lý đan xen và xử lý song song của giao tác đồng thời


1.1.2 Các giao tác, các thao tác Đọc và Ghi, vùng đệm DBMS

̣
t giao tác l à mô
̣
t đơn vị logic x ử lý CSDL, nó bao gồm một hoặc
nhiều thao tác truy cập dữ liệu như chèn, xoá, sửa đổi hoặc lấy thông tin ra.
Các thao tác trong cơ sở dữ liệu cấu thành một giao tác có thể hoặc được
nhúng vào một chương trình ứng dụng hoặc được chỉ rõ một cách tương tác
thông qua một ngôn ngữ truy vấn bậc cao như SQL [1].
A
B
A
B
D
C
CPU
1
CPU
2
t
1
t
2
t
3
t
4

9


̣
t hê
̣
thống OLTP (xư
̉
ly
́
giao ta
́
c trư
̣
c tuyến ) hoạt động theo thời gian
thư
̣
c nhằm thu t hập và xử lý dữ liệu có liên quan đến giao tác và gởi các thay
đô
̉
i đến ca
́
c cơ sơ
̉

̃
liê
̣
u du
̀
ng chung va
̀

ca
́
c file kha
́
c .
Trong viê
̣
c xư
̉
ly
́
giao ta
́
c trư
̣
c tuyến , các giao tác được thực hiện ngay ,
trái với việc xử lý theo lô , các giao tác được lưu trong một khoảng thời gian
sau đo
́

́
i đươ
̣
c thư
̣
c hiê
̣
n . Đa số ca
́
c xư

̉
ly
́
theo lô như viê
̣
c chuyê
̉
n khoa
̉
n
đươ
̣
c thư
̣
c hiê
̣
n va
̀
o giơ
̀
đêm . Các kết quả của một xử lý giao tác trực tuyến thì
có ngay trong cơ sơ
̉

̃
liê
̣
u . Nó khẳng định giao tác đã hoàn thành . Các ví dụ
thông du
̣

ng nhất cu
̉
a viê
̣
c xử lý giao tác trực tuyến là hệ thống đặt chổ Hàng
Không va
̀

̣
thống giao di
̣
ch Ngân ha
̀
ng .
Hãng IBM đã định nghĩa các loại giao ta
́
c sau:
Tại một thời điểm có một câu lệnh được thực hiện trên mộ t cơ sơ
̉

̃

liê
̣
u.

̣
t đơn vi
̣
công viê

̣
c (bao gồm nhiều câu lê
̣
nh ) đươ
̣
c thư
̣
c hiê
̣
n trên mô
̣
t
cơ sơ
̉

̃
liê
̣
u.

̣
t đơn vi
̣
công viê
̣
c trên môi trươ
̀
ng phân bố (bao gồm nhiều câu lê
̣
nh )

đươ
̣
c thư
̣
c hiện trên nhiều cơ sơ
̉

̃
liê
̣
u , tại một thời điểm thì một câu lệnh
đươ
̣
c thư
̣
c hiê
̣
n trên mô
̣
t cơ sơ
̉

̃
liê
̣
u.

̣
t yêu cầu trên hê
̣

thống phân bố (bao gồm nhiều câu lê
̣
nh ) thư
̣
c hiê
̣
n
trên nhiều cơ s ở dữ liệu , tại một thời điểm thì có nhiều câu lệnh được thực
hiê
̣
n trên mô
̣
t cơ sơ
̉

̃
liê
̣
u.
Các hệ quản trị cơ sở dữ liệu thực hiện các giao tác bằng cách sử dụng
các lệnh hoặc là được nhúng vào trong chương trình ứng dụng hoặc tương tác
theo danh nghĩa qua một ngôn ngữ truy vấn bậc cao như SQL. Trong chương
trình ứng dụng, biên giới giao tác được xác định một cách rõ ràng thông qua

10
các câu lệnh Begin Transaction và End Transaction. Trong trường hợp này tất
cả các thao tác truy cập cơ sở dữ liệu giữa 2 câu lệnh đó được coi như tạo ra
một giao tác. Một chương trình ứng dụng có thể chứa nhiều hơn một giao tác
nếu nó chứa nhiều biên giới giao tác. Nếu các thao tác CSDL không cập nhật
CSDL mà chỉ lấy thông tin ra thì gọi đó là giao tác được gọi là giao tác chỉ

đọc (read only transaction).
Chúng ta giải thích các khái niệm xử lý giao tác thông qua một mô hình
một cơ sở dữ liệu đơn giản.Về cơ bản, một cơ sở dữ liệu được miêu tả như
một tập hợp các file dữ liệu và mỗi bản ghi của file có một số các trường. Các
thao tác truy cập CSDL cơ bản mà một giao tác có thể có là [1]:
Read_item(X): Đọc một mục dữ liệu có tên X trong CSDL vào một biến
chương trình. Để đơn giản ký hiệu, ta giả sử biến đó cũng có tên là X
Write_item(X): Ghi giá trị của biến chương trình X vào một mục của
CSDL có tên X
Đơn vị cơ bản của truyền dữ liệu từ đĩa vào bộ nhớ chính là một khối.
Việc thực hiện một câu lệnh read_item(x) bao gồm các bước sau [1]:
Bước 1: Tìm địa chỉ của khối đĩa chứa mục dữ liệu X
Bước 2: Sao chép khối đĩa đó vào một vùng đệm trong bộ nhớ chính
(nếu khối đĩa đó chưa có trong vùng đềm bộ nhớ chính)
Bước 3: Sao chép dữ liệu X từ vùng đệm vào biến chương trình X
Việc thực hiện một câu lệnh write_item(X) bao gồm các bước sau:
Bước 1: Tìm địa chỉ của khối đĩa chứa mục dữ liệu X
Bước 2: Sao chép khối đĩa đó vào một vùng đệm trong bộ nhớ chính
(nếu khối đĩa đó chưa có trong vùng đệm)

11
Bước 3: Sao chép mục dữ liệu X từ biến chương trình X vào đúng vị trí
của nó trong vùng đệm
Bước 4: Lưu khối đã được cập nhật từ vùng đệm trở lại đĩa (hoặc là ngay
lập tức hoặc sau 1 khoảng thời gian).
Trong thực tế, bước 4 là một bước cập nhật cơ sở dữ liệu trên đĩa. Trong
một số trường hợp vùng đệm không được lưu ngay vào đĩa nếu có sự thay đổi
được tạo ra cho vùng đệm. Thông thường, quyết định khi nào lưu lại một khối
đĩa đã được thay đổi trong vùng đệm bộ nhớ chính được điều khiển bởi bộ
phận quản lý phục hồi dữ liệu (recovery manager) của DBMS phối hợp với hệ

điều hành cơ sở. Nói chung, DBMS sẽ duy trì một số vùng đệm trong bộ nhớ
chính để chứa các khối dữ liệu bao gồm các mục cơ sở dữ liệu đang được xử
lý. Khi tất cả các vùng đệm này đã bị chiếm giữ và có thêm các khối dữ liệu
phải được sao chép vào bộ nhớ thì chính sách thay thế một số vùng đệm được
sử dụng để lựa chọn vùng đệm nào sẽ được thay thế. Nếu lựa chọn vùng đệm
đã có thay đổi dữ liệu trong vùng đệm đó phải được ghi trở lại đĩa trước khi
được tái sử dụng [1].
Một giao tác bao gồm các thao tác read_item và write_item để truy cập
và cập nhật cơ sở dữ liệu. Hình 1.2 thể hiện một ví dụ về 2 giao tác đơn giản.
(a) T
1
(b) T
2
Read_item(X); Read_item(X);
X:=X+N; X:=X+M;
Write_item(X); Write_item(X);
Read_item(Y);
Y:=Y+N;
Write_item(Y);
Hình 1.2 : Hai giao tác mẫu, (a) Giao tác T
1
, (b) Giao tác T
2


12
Cơ chế phục hồi và điều khiển đồng thời chủ yếu liên quan các câu lệnh
truy cập cơ sở dữ liệu trong một giao tác. Các giao tác được nhiều người dùng
khác nhau đệ trình có thể thực hiện một cách đồng thời và có thể truy cập và
cập nhật các mục cơ sở dữ liệu giống nhau. Nếu việc thực hiện đồng thời này

không được điều khiển có thể sẽ dẫn đến nhiều vấn đề, chẳng hạn như việc cơ
sở dữ liệu không nhất quán.
1.1.3 Vì sao điều khiển đồng thời là cần thiết
Nhiều vấn đề có thể xảy ra khi các giao tác đồng thời thực hiện theo cách
thức không được điều khiển. Ta sẽ minh hoạ một số vấn đề này bằng việc
tham khảo cơ sở dữ liệu đặt vé máy bay đã được đơn giản hoá, trong đó một
bản ghi được lưu trữ cho mỗi chuyến bay. Hình 1.2 (a) thể hiện giao tác T
1
,
giao tác này chuyển N chỗ từ một chuyến bay có số chỗ được lưu trữ trong
mục CSDL có tên X sang chuyến bay khác có số chỗ được lưu trữ trong mục
CSDL có tên Y. Hình 1.2(b) thể hiện giao tác T
2
đơn giản hơn, giao tác này
đặt trước M chỗ trên chuyến bay thứ nhất (X) được tham chiếu trong giao tác
T
1
. Để làm đơn giản ví dụ, ta không đưa vào đây các phần phụ của giao tác
như kiểm tra xem nếu một chuyến bay có đủ chỗ sẵn sàng trước khi đặt thêm
các chỗ hay không [1].
Khi một chương trình truy cập cơ sở dữ liệu được viết, nó có số các
chuyến bay, ngày bay và số chỗ được đặt trước như là một tham số. Như vậy,
có thể sử dụng cùng một chương trình đó để thực hiện nhiều giao tác, mỗi
giao tác với từng chuyến bay và số chỗ được đặt khác nhau. Với mục đích
điều khiển đồng thời, một giao tác là một thực hiện cụ thể của chương trình
trên một ngày bay, chuyến bay và số chỗ cụ thể. Trong hình 1.2(a) và (b) các
giao tác T
1
và T
2

là các thực hiện cụ thể của các chương trình tham chiếu đến
các chuyến bay cụ thể mà số chỗ của chúng được lưu trong các mục dữ liệu X

13
và Y trong cơ sở dư liệu. Nếu hai giao tác này chạy đồng thời, có thể dẫn đến
các vấn đề sau đây:
a. Cập nhật bị mất (Lost Update)
Vấn đề này xảy ra khi hai giao tác truy cập vào các mục CSDL như nhau
có các thao tác xen kẽ nhau theo cách làm cho giá trị của một số mục dữ liệu
không chính xác. Giả sử rằng các giao tác T
1
và T
2
được đệ trình gần như
cùng tại một thời điểm và các thao tác của chúng được thực hiện xen kẽ như
thể hiện trong hình 1.3 a); khi đó giá trị cuối cùng của mục X là không chính
xác bởi vì T
2
nhận được giá trị của X trước khi T
1
thay đổi nó trong cơ sở dữ
liệu và do đó giá trị được cập nhật tạo ra từ T
1
bị mất. Cụ thể, nếu ban đầu có
X= 80 (ban đầu có 80 chỗ ngồi trên chuyến bay), N=5 (T
1
chuyển 5 chỗ từ
chuyến bay tương ứng với X sang chuyến bay tương ứng với Y ), và M=4
(giao tác T
2

dành 4 chỗ trên chuyến bay X). Kết quả cuối cùng phải là 79
nhưng vì có sự xen kẽ của các thao tác như được chỉ ra trong hình 1.3 (a) nên
X=84 vì cập nhật trong T
1
chuyển 5 chổ khỏi X bị mất [1][4].
a)
T
1
T
2

Read_item (X);
X := X-N;
Read_item (X);
X := X+M ;
Thời Write_item (X);
gian Read_item (Y);
Write_item (X); /* mục X có giá trị
không chính xác vì cập
nhật của nó bởi T
1
bị “lạc”*/
Y := Y+N ;
Write_item (Y);

Hình 1.3a) Vấn đề cập nhật bị mất

14
b. Vấn đề cập nhật tạm thời (hoặc Dirty Read)
Vấn đề xẩy ra khi một giao tác cập nhật một mục cơ sở dữ liệu và sau đó

giao tác thất bại do một lý do nào đấy. Mục được cập nhật được giao tác khác
truy cập trước khi nó phải được thay đổi trở lại giá trị ban đầu của nó. Hình
1.3(b) trình bày một ví dụ trong đó T
1
cập nhật mục X và sau đó thất bại trước
khi hoàn thành, do đó hệ thống phải thay đổi X trả lại giá trị ban đầu của nó.
Tuy nhiên, trước khi nó có thể làm điều đó thì giao tác T
2
đã đọc giá trị “tạm
thời” của X, giá trị này sẽ không được ghi lại một cách thường trực trong cơ
sở dữ liệu do sự hư hỏng của T
1
. Giá trị của mục X được T
2
đọc được gọi là
dữ liệu rác (dirty) bởi vì nó được tạo ra bởi một giao tác chưa được hoàn
thành và ghi lại. Vấn đề này gọi là vấn đề dirty read [1][4].

T
1
T
2


Read_item (X);
X := X - N;
Write_item (X);
Thời gian Read_item (X);
X := X+M ;
Write_item (X);

Read_item (Y);
Giao tác T
1
thất bại
và phải thay đổi giá
trị của X trở về giá trị cũ của nó
trong khi đó T
2
đã đọc giá trị
“tạm thời” không chính xác của X
Hình 1.3 b) vấn đề cập nhật tạm thời


15
Vấn đề tóm tắt không chính xác : Nếu một giao tác đang tính toán một
hàm tổng nhóm trên một số bản ghi trong khi các giao tác khác đang cập nhật
các bản ghi đó, hàm nhóm có thể tính một số giá trị trước khi chúng được cập
nhật và các giá trị khác sau khi chúng được cập nhật. Ví dụ, giả sử một giao
tác T
3
đang tính tổng số vé được đặt trước trên tất cả các chuyến bay, trong
khi đó giao tác T
1
đang thực hiện. Nếu sự đan xen của các thao tác thể hiện
trong hình 4.3(c) xẩy ra, kết quả của T
3
sẽ bị thiếu hụt số chỗ N bởi vì T
3
đọc
giá trị X sau khi bị trừ đi N nhưng đọc giá trị Y trước N chỗ được cộng thêm

vào nó [1].
T
1
T
3

Sum:= 0;
read_item(A) ;
Sum:= sum +A;
Read_item (X);
X := X-N;
Write_item (X);
Read_item (X);
Sum:= sum +X; /*T3 đọc X
Read_item (Y); sau khi trừ đi N và đọc
Sum:= sum +Y; Y trước khi được cộng
thêm N. Tổng kết sai */
Read_item (Y);
Y := Y+N ;
Write_item (Y);
Hình 1.3 c)Vấn đề tóm tắt thiếu chính xác
Vấn đề khác có thể xẩy ra được gọi là đọc không lặp lại, trong đó một
giao tác T đọc một mục dữ liệu 2 lần và mục dữ liệu đó được thay đổi bởi

16
giao tác T’ khác giữa hai lần đọc. Như vậy, T nhận được hai giá trị khác nhau
với hai lần đọc cùng mục dữ liệu của nó. Điều này có thể xẩy ra, nếu trong
một giao tác đặt chỗ, một khách hàng đang hỏi về một chỗ có trên một số
chuyến bay. Khi khách hàng quyết định trên một chuyến bay cụ thể, khi đó
giao tác đọc số chỗ trên chuyến bay đó hai lần trước khi hoàn thành việc đặt

chỗ. [1]
1.1.4 Tại sao khôi phục là cần thiết
Mỗi khi một giao tác được đệ trình tới một DBMS để thực hiện, hệ thống
chịu trách nhiệm đảm bảo hoặc (1) tất cả các thao tác trong giao tác được kết
thúc thành công và ảnh hưởng của chúng được ghi lại một cách thường trực
trong cơ sở dữ liệu, hoặc (2) giao tác không có bất cứ ảnh hưởng nào lên cơ
sở dữ liệu hoặc lên các giao tác khác. DBMS phải không cho phép một số
thao tác của một giao tác T có thể được áp dụng lên cơ sở dữ liệu trong khi
các thao tác khác của T không được áp dụng. Điều này xẩy ra nếu một giao
tác thất bại sau khi một số thao tác của nó được thực hiện nhưng trước khi
thực hiện toàn bộ các thao tác.
Các kiểu lỗi: lỗi được phân thành lỗi thiết bị, lỗi hệ thống và lỗi giao tác.
Có nhiều nguyên nhân để một giao tác thất bại trong khi thực hiện:
1. Một hỏng hóc máy tính: một hỏng hóc phần cúng, phần mềm, hoặc
mạng xẩy ra trong hệ thống máy tính trong khi thực hiện giao tác
2. Lỗi giao tác hoặc lỗi hệ thống: một số thao tác trong một giao tác có
thể làm cho giao tác bị lỗi, chẳng hạn như tràn số nguyên lỗi chia cho 0. Thất
bại giao tác cũng có thể xẩy ra do các giá trị của tham số không đúng hoặc do
một lỗi lập trình logic. Thêm vào đó, người dùng có thể ngắt một giao tác
trong khi thực thi nó

17
3. Các lỗi cục bộ hoặc các điều kiện ngoại lệ do giao tác phát hiện:
trong khi thực hiện giao tác, các điều kiện nào đó có thể xẩy ra cần loại bỏ
giao tác. Ví dụ dữ liệu cho giao tác có thể không tìm thấy.
4. Buộc tuân theo điều khiển đồng thời : phương pháp điều khiển đồng
thời có thể quyết định bỏ dở một giao tác, sẽ được khởi động lại sau đó, bởi vì
nó vi phạm trật tự hoặc bởi vì nhiều một giao tác đang trong trạng thái bế tắc
5. Hỏng hóc đĩa : một số khối đĩa có thể mất dữ liệu do hàm đọc hoặc
ghi sai. Điều này có thể xẩy ra trong một thao tác đọc hoặc của giao tác

6. Các vấn đề vật lý và các thảm họa : các vấn đề này được xem như
danh sách vô tận các vấn đề bao gồm nguồn điện , cháy , trộm , sự phá hoại ,
đĩa quá tải…
Các lỗi thuộc kiểu 1, 2, 3 và 4 phổ biến hơn các lỗi thuộc kiểu 5 và 6.
Khi một lỗi thuộc kiểu từ 1 đến 4 xẩy ra, hệ thống phải giữ thông tin đầy đủ
để khôi phục lại từ lỗi. Lỗi đĩa hoặc các lỗi do thảm hoạ thuộc kiểu 5 hoặc 6
không xẩy ra một cách thường xuyên.
1.2 Các khái niệm hệ thống và giao tác
1.2.1 Các trạng thái giao tác và các thao tác bổ sung
Một giao tác là một đơn vị nguyên tử của công việc, nó hoặc là được
hoàn thành toàn bộ hoặc không làm gì cả. Đối với mục đích khôi phục, hệ
thống cần lưu lại vết của một giao tác khi bắt đầu, kết thúc, xác nhận hoặc
huỷ bỏ. Do đó, bộ quản lý khôi phục lưu vết của các thao tác dưới đây [1]:
- BEGIN_TRANSACTION : Điều này đánh dấu bắt đầu thực hiện giao
tác
- READ hoặc WRITE : Điều này chỉ ra các thao tác đọc và viết trên các
mục cơ sở dữ liệu, chúng được thực hiện như một phần của giao tác
- END_TRANSACTION : Điều này chỉ ra rằng các thao tác READ và
WRITE của giao tác đã kết thúc và đánh dấu kết thúc việc thực hiện giao

18
tác. Tuy nhiên tại điểm này cần phải kiểm ra xem các thay đổi do giao
tác tạo ra có thể được áp dụng một cách thường trực đối với cơ sở dữ
liệu (commited – được lưu) hoặc có phải giao tác bị huỷ bỏ (aborted)
do vi phạm trật tự hoặc vì các lý do khác
- COMMIT_ TRANSACTION : Điều này báo hiệu một kết thúc thành
công của giao tác sao cho mọi sự thay đổi (update) được giao tác thực
hiện có thể được chuyển an toàn tới cơ sở dữ liệu và sẽ không bị bỏ ra.
- ROLLBACK (hoặc ABORT) : Điều này báo hiệu rằng giao tác kết thúc
không thành công, do đó bất kỳ sự thay đổi hoặc ảnh hưởng nào mà giao

tác có thể áp dụng đến cơ sở dữ liệu phải được huỷ bỏ.
Hình 1.4 trình bày một sơ đồ trạng thái giao tác, nó mô tả một giao tác đi
qua các trạng thái thực hiện của nó như thế nào. Một giao tác đi vào trạng thái
tích cực (active state) ngay sau khi nó bắt đầu thực hiện, tại đó nó có thể đưa
ra các thao tác READ và WRITE. Khi giao tác kết thúc, nó chuyển tới trạng
thái được ghi nhận một phần (partial commited state). Tại điểm này, cần một
số giao thức khôi phục để đảm bảo rằng một lỗi hệ thống sẽ không dẫn đến
việc không có khả năng ghi lại các thay đổi của giao tác một cách thường trực
(thường là bằng việc ghi lại các thay đổi trong log hệ thống). Mỗi khi việc
kiểm ra này thành công thì giao tác được xem là đã tiếp cận đến điểm ghi
nhận và đi vào trạng thái ghi nhận (commited state). Mỗi khi giao tác được
ghi nhận, nó chấm dứt việc thực hiện của nó một cách thành công và mọi thay
đổi của nó phải được ghi lại một cách thường trực trong cơ sở dữ liệu [1][4].
Tuy nhiên, một giao tác có thể dẫn tới trạng thái thất bại (failed state)
nếu một trong các kiểm tra là thất bại hoặc nếu giao tác bị huỷ bỏ trong khi nó
ở trạng thái hoạt động. Giao tác này sau đó phải được xem lại để xoá bỏ ảnh
hưởng của các thao tác WRITE của nó lên cơ sở dữ liệu. Trạng thái kết thúc
(terminated) tương đương với việc là giao tác ra khỏi hệ thống. Thông tin về

19
giao tác được duy trì trong các bảng hệ thống trong khi giao tác đang thực
hiện được huỷ bỏ khi giao tác kết thúc. Các giao tác thất bại hoặc bị huỷ bỏ có
thể được khởi động lại sau đó, hoặc một cách tự động hoặc sau khi được
người dùng đệ trình lại như các giao tác mới [1].







Hình 1.4 Sơ đồ chuyển trạng thái thực thi giao tác
1.2.2 File log hệ thống (the system log)
Để có thể khôi phục lại các hư hỏng ảnh hưởng các giao tác, hệ thống
duy trì một file log (nhật ký DBMS )để lưu giữ dấu vết của tất cả các thao tác
của giao tác ảnh hưởng đến các giá trị của các mục dữ liệu .Thông tin này cần
đến để cho phép khôi phục lại các hư hỏng. Log được lưu trên đĩa, do đó nó
không bị ảnh hưởng bởi bất kỳ loại hư hỏng nào ngoại trừ trường hợp hư
hỏng đĩa hoặc thảm hoạ. Thêm vào đó file log này được sao lưu một cách
định kỳ ra băng hoặc phòng các trường hợp thảm hoạ. Bây giờ chúng ta sẽ
đưa ra danh sách các bản ghi, được gọi là các bản ghi log, được ghi vào trong
file và hành động thực hiện của nó [1][9].
1 [Start_transaction, T ] : Chỉ ra rằng giao tác T đã bắt đầu thực hiện
2 [Write_item, T ,X ,old_value, new_value] : Chỉ ra rằng giao tác T đã
thay đổi giá trị của mục cơ sở dữ liệu X từ giá trị cũ sang giá trị mới
ACTIVE
BEGIN
TRANSACTION
READ
WRITE
END
TRANSACTION
PARTIALLY
COMMITTED
COMMITTED
COMMIT
TERMINATED
FAILED
ABORT
ABORT


20
3 [Read_item,T,X]: Chỉ ra rằng giao tác T đã đọc giá trị của mục cơ sở
dữ liệu X
4 [Commit,T] : Chỉ ra rằng giao tác T đựơc kết thúc thành công , và xác
nhận rằng những ảnh hưởng của nó có thể được ghi nhận (ghi lại một
cách thường trực) vào trong cơ sở dữ liệu
5 [Abort ,T] : Chỉ ra rằng giao tác T bị huỷ bỏ
Để ý rằng ở đây chúng ta giả thiết rằng tất cả các thay đổi thường trực
đối với cơ sở dữ liệu xảy ra bên trong các giao tác vì vậy khái niệm khôi phục
từ giao tác hư hỏng chung quy là hoặc loại bỏ, hoặc làm lại các thao tác của
giao tác một cách riêng rẽ từ file log. Nếu hệ thống đổ vỡ, chúng ta có thể
khôi phục đến một trạng thái cơ sở dữ liệu thích hợp bằng cách xem xét file
log và sử dụng các kỹ thuật phục hồi. Bởi vì log chứa một bản ghi của mỗi
thao tác WRITE làm thay đổi giá trị của một vài mục cơ sở dữ liệu, nên có thể
loại bỏ (undo) ảnh hưởng của các thao tác WRITE của giao tác T bằng cách
lần lùi thông qua log và thiết lập lại các mục do thao tác WRITE của T làm
thay đổi thành các giá trị-cũ của nó. Việc làm lại các thao tác của một giao tác
cũng có thể cần nếu mọi cập nhật của nó được ghi lại trong log nhưng một hư
hỏng xuất hiện trước khi chúng ta có thể tin chắc rằng tất cả các giá trị-mới
này đã được ghi một cách thường trực vào cơ sở dữ liệu hiện tại trên đĩa. Việc
làm lại các thao tác của một giao tác T được áp dụng bằng cách lần lên thông
qua log và thiết lập tất cả các mục được thay đổi bằng thao tác WRITE của T
thành giá trị-mới của chúng [1].
1.2.3 Điểm xác định hoàn thành của giao tác
Một giao tác T tiến đến điểm xác nhận khi toàn bộ các thao tác truy cập
cơ sở dữ liệu của nó đã được thực hiện thành công và ảnh hưởng của tất cả
các thao tác của giao tác lên cơ sở dữ liệu đã được ghi lại vào file log. Ngoài
điểm xác nhận, giao tác được gọi là đã được xác nhận, và ảnh hưởng của nó

21

được xem như đã được ghi lại một cách thường trực trong cơ sở dữ liệu. Sau
đó giao tác ghi một bản ghi xác nhận [commit,T] vào trong fỉle log. Nếu xẩy
ra một hư hỏng hệ thống, chúng ta tìm kiếm lùi trong file log đối với tất cả
các giao tác T đã ghi một bản ghi [start_transaction,T] vào trong file log
nhưng vẫn chưa ghi bản ghi [commit,T] của chúng; các giao tác này có thể sẽ
được cuộn lại để loại bỏ ảnh hưởng của nó lên cơ sở dữ liệu trong tiến trình
khôi phục. Các giao tác đã ghi bản ghi commit của nó vào log cũng phải được
ghi lại tất cả các thao tác WRITE của nó vào log, vì vậy ảnh hưởng của nó
trên cơ sở dữ liệu có thể làm lại từ các bản ghi log [1][9].
Chú ý rằng file log phải được lưu giữ trên đĩa. Việc cập nhật một file đĩa
bao gồm việc sao chép khối thích hợp của file từ đĩa vào một buffer trong bộ
nhớ trong, cập nhật buffer trong bộ nhớ trong và sao chép buffer vào đĩa. Một
cách phổ biến là lưu một hoặc nhiều khối của file log trong các vùng đệm của
bộ nhớ trong cho tới khi các vùng đệm được điền đầy bằng các bản ghi log và
sau đó chúng được ghi lại vào đĩa chỉ một lần chứ không ghi lên đĩa mỗi một
lần có một bản ghi log được thêm vào. Điều này tiết kiệm được chi phí ghi đĩa
nhiều lần của cùng một khối file log. Tại thời điểm một hệ thống sụp đổ, chỉ
các bản ghi log đã được ghi trở lại trên đĩa là được xem xét trong tiến trình
khôi phục bởi vì nội dung của bộ nhớ chính có thể bị mất. Vì thế, trước khi
một giao tác đến tới điểm xác nhận của nó, bất kỳ phần nào của file log chưa
được ghi lên đĩa thì phải được ghi lên đĩa. Quá trình này được gọi là bắt buộc-
ghi (force-writing) file log trước khi xác nhận một giao tác [1].
1.3 Các đặc trƣng của giao tác
Các giao tác sẽ có nhiều đặc trưng. Các đặc trưng này thường được gọi
là các đặc trưng ACID (Atomicity, Consistency preservation, Isolation,
Durability or permanency). Các đặc trưng ACID là:

22
1. Tính nguyên tử (Atomicity): Một giao tác là một đơn vị xử lý nguyên
tử. Nó hoặc là được thực hiện trọn vẹn hoặc không thực hiện gì cả

[1][4][5].
2. Tính nhất quán (Consistency preservation): Một giao tác là giữ gìn kiên
định nếu sự thực hiện đầy đủ của nó đưa cơ sở dữ liệu từ trạng thái kiên
định sang trạng thái kiên định khác [1][4][5].
3. Tính cách ly (isolation) Một giao tác phải xuất hiện như nó được thực
hiện trong sự cô lập khỏi các giao tác khác. Điều đó có nghĩa là việc
thực hiện của một giao tác sẽ không bị các giao tác khác thưc hiện đồng
thời quấy rầy[1][4][5].
4. Tính bền vững (durability or permanency): Các thay đổi được áp dụng
cho cơ sở dữ liệu bởi một giao tác được xác nhận phải bền bỉ trong cơ
sở dữ liệu. Các thay đổi này phải không bị mất do bất cứ hư hỏng
nào[1][4][5].
Tính chất nguyên tử đòi hỏi rằng chúng ta thực hiện một giao tác cho
đến khi hoàn thành. Trách nhiệm của hệ thống con khôi phục giao tác của
DBMS đảm bảo tính nguyên tử. Nếu một giao tác thất bại để hoàn thành do
một lý do nào đấy, một hệ thống như vậy đổ vỡ ở giữa việc thực hiện giao tac,
kỹ thuật khôi phục phải loại bỏ mọi ảnh hưởng của giao tác lên cơ sở dữ liệu.
Việc giữ gìn tính nhất quán nói chung được xem như trách nhiệm của
những người lập trình, những người viết các chương trình cơ sở dữ liệu hoặc
các modul của hệ quản trị cơ sở dữ liệu bắt tuân theo các ràng buộc toàn vẹn.
Nhắc lại rằng một trạng thái cơ sở dữ liệu là một tập hợp các mục dữ liệu (giá
trị) được lưu giữ trong cơ sở dữ liệu tại một thời điểm cho trước. Một trạng
thái nhất quán của cơ sở dữ liệu thoả mãn các ràng buộc được chỉ ra trong
lược đồ cũng như các ràng buộc bất kỳ khác sẽ giữ trên cơ sở dữ liệu. Một
chương trình cơ sở dữ liệu phải được viết theo cách đảm bảo rằng nếu cơ sở

23
dữ liệu là ở trong một trạng thái nhất quán trước khi thực hiện thao tác thì nó
sẽ ở trong trạng thái nhất quán sau khi hoàn thành việc thực hiện giao tác với
giả thiết rằng không có sự trở ngại với các giao tác khác xảy ra [1].

Tính cô lập được hệ thống con kiểm soát sự đồng thời của DBMS bắt
buộc. Nếu mỗi một giao tác không làm cho các cập nhật của nó nhìn thấy
được đối với các giao tác khác cho đến khi nó được xác nhận, một dạng cô lập
được bắt buộc, nó giải quyết vấn đề cập nhật tạm thời và loại bỏ các rollback
đồng loạt. Đã có những cố gắng định nghĩa mức cô lập của một giao tác. Một
giao tác được gọi là có mức cô lập 0 nếu nó không viết đè các đọc rác (dirty
read) của các giao tác bậc cao. Cô lập ở mức 1 giao tác không mất các cập
nhật và cô lập mức 2 không có mất các cập nhật và không có các đọc rác.
Cuối cùng, cô lập mức 3 (cũng được gọi là cô lập đúng) có các đọc lặp cộng
với các tính chất mức 2.
Cuối cùng tính chất bền vững là trách nhiệm của hệ thống con phục hồi
của DBMS.
1.4. Lịch biểu và khả năng phục hồi
Khi các giao tác thực thi đồng thời theo cách đan xen nhau thì thứ tự
thực hiện của các thao tác từ các giao tác khác nhau được xem như một lịch
biểu (schedule). Trong phần này, trước hết chúng ta định nghĩa khái niệm của
lịch biểu, sau đó mô tả các đặc điểm các kiểu lịch biểu làm dễ việc khôi phục
khi xẩy ra các thất bại
1.4.1 Lịch biểu của các giao tác
Một lịch biểu (hoặc lịch sử) S của n giao tác T
1
, T
2
, …,T
n
là một thứ tự
của các thao tác của các giao tác chịu ràng buộc rằng với mỗi giao tác T
i
tham
gia trong S, các thao tác của T

i
trong S phải xuất hiện theo thứ tự như chúng
xuất hiện trong T
i
. Tuy nhiên, để ý rằng các thao tác từ các T
j
khác có thể

×