Tài liệu này dành cho sinh viên, giáo viên khối ngành công nghệ thông tin tham khảo và có những bài học bổ ích hơn, bổ trợ cho việc tìm kiếm tài liệu, giáo án, giáo trình, bài giảng các môn học khối ngành công nghệ thông tin
Trang 1Ng Duc Thuan
I Giao tác (transaction)
1 Khái niệm:
Giao tác là một tập hợp các thao tác có thứ tự truy xuất dữ liệu trên CSDL thành một đơn vị
công việc logic (xem là một thao tác nguyên tố ), chuyển CSDL từ trạng thái nhất quán này
sang trạng thái nhất quán khác
Để ghi nhận sự hoàn tất hay không của một giao tác, người ta sử dụng các lệnh sau:
BEGIN TRANSACTION Bắt đầu một giao tác
COMMIT TRANSACTION Kết thúc giao tác thành công
ROLLBACK TRANSACTION Kết thúc giao tác không thành công, những thao tác làm
ảnh hưởng CSDL đã được thực hiện trước đó được undo, CSDL được trả về tình trạng trước khi thực hiện giao tác
END TRANSACTION Chỉ mang ý nghĩa hình thức, thường không sử dụng
Ví dụ: Cho 2 quan hệ
- LOP (Malop, Tenlop, SoSV)
- SV (MaSV, TenSV, Malop)
Quy định: khi thêm một sinh viên vào một lớp thì phải cập nhật lại sỉ số của lớp đó
Ø Giao tác thêm 1 SV vào 1 lớp:
BEGIN TRANSACTION Them_SV
Insert into SV values(v_masv,v_tensv,v_malop)
Update LOP
Set SoSV = SoSV + 1
Where Malop = v_malop
COMMIT TRANSACTION Them_SV
2 Các tính chất của giao tác: ACID
a Tính nguyên tố (Atomic)
- 1 giao tác là 1 đơn vị xử lý không thể chia nhỏ được nữa; hoặc là tất cả các thao tác trong
giao tác được thực hiện (được ghi nhận chắc chắn), hoặc là không có thao tác nào được ghi nhận
kết quả.(Nếu chia nhỏ giao tác thành các thao tác thì sẽ không đảm bảo tính nhất quán của
CSDL.)
b Tính nhất quán (Consistency)
- Giao tác chuyển CSDL từ tình trạng nhất quán này sang tình trạng nhất quán khác
c Tính cô lập (Isolation)
- Các giao tác xử lý đồng thời phải độc lập với những thay đổi được thực hiện bởi các giao tác
chưa hoàn tất khác (những thay đổi này chưa hình thành nên 1 trạng thái nhất quán của CSDL)
d Tính lâu dài, bền vững (Durability)
- Tất cả những thay đổi lên CSDL mà giao tác thực hiện cho đến khi được xác nhận hoàn tất
(commit) thì phải được ghi nhận chắc chắn lên CSDL
Trang 2Ng Duc Thuan
II Các vấn đề của việc truy xuất đồng thời:
1 Mất dữ liệu cập nhật (lost update)
Ø Ví dụ: Cho quan hệ HANGHOA (MaHH, TenHH, ĐVT, SLTon)
SLTon = 20
Transaction Giá trị T1 (bán hàng) T2 (bán hàng) x1 x2 SLTon
Read (SLTon) à x1 20 20
Read (SLTon) à x2 20 20 20 x1 – 10 à x1 10 20 20
x2 – 3 à x2 10 17 20 Write x1à SLTon 10 17 10
Write x2à SLTon 10 17 17
Ø Lost Update: Thao tác cập nhật của T1 coi như bị mất, không được ghi nhận (do những thay
đổi của các giao tác khác ghi đè lên)
2 Đọc dữ liệu chưa commit (uncommitted data)
Ø Ví dụ: Cho quan hệ HANGHOA (MaHH, TenHH, ĐVT, SLTon)
SLTon = 20
Transaction Giá trị T1 (nhập hàng) T2 (bán hàng) x1 X2 SLTon
Read (SLTon) à x1 20 20
x1 + 100 à x1 120 20
Write x1à SLTon 120 120
Read (SLTon) à x2 120 120 120 x2 – 5 à x2 120 115 120 Write x2à SLTon 120 115 115
Ø Transaction T1 sửa đổi dòng X nhưng chưa commit, Transaction T2 đọc dòng X
Transaction T1 rollback những gì đã thay đổi trên dòng X => dữ liệu mà Transaction T2 đang
đọc chưa hề tồn tại
3 Thao tác đọc không thể lặp lại (unrepeatable data)
Ví dụ: Xét 2 giao tác sau:
T1 T2
Read(A) Read(A)
A=A+10 Print(A)
Write(A) Read(A)
Print(A)
Trang 3Ng Duc Thuan
Giả sử A=20 và 2 giao tác này thực hiện đồng thời theo thứ tự sau:
Transaction Giá trị T1 T2 x1 x2 A
Read (A) à x1 20 20
Begin Transaction
Read (A) à x2 20 20 20
x1+10 à x1 30 20 20
Print (x2) 30 20 20
Write x1 à A 30 20 30
Read (A) à x2 30 30 30
Commit T1
Ø Khi giao tác T2 đọc nhiều lần trên cùng một dòng dữ liệu, giữa 2 lần đọc thì có một thao
tác làm thay đổi giá trị dòng đó ở giao tác T1 => trong giao tác T2 mỗi lần đọc dòng đó
sẽ cho ra những kết quả khác nhau
4 Vấn đề “bóng ma” (phantom)
Ví dụ: T1 thực hiện việc chuyển tiền từ tài khoản A sang tài khoản B Khi T1 mới chỉ thực
hiện thao tác trừ số tiền ở tài khoản A (chưa cộng số tiền vào tài khoản B) thì T2 muốn xem
tổng số tiền ở hai tài khoản => Tổng số tiền không chính xác
Transaction T1 T2
Begin Transaction
Read (A) A=A-50 Write (A)
Begin Transaction
Read(A) Read (B) Print (A+B)
Commit T2
Read (B) B=B+50 Write (B)
Commit T1
Ø Như vậy, một tiêu chuẩn để lập lịch các giao tác là việc thực hiện đồng thời các giao tác cho
kết quả giống như khi thực hiện tuần tự các giao tác
III Đơn vị dữ liệu:
1 Định nghĩa:
- Đơn vị dữ liệu (item) là đơn vị nhỏ nhất mà hệ quản trị CSDL có thể đọc/ghi một lần, là đơn
vị để giải quyết tranh chấp
- Đơn vị dữ liệu có thể là database, table, field, record,…
Trang 4Ng Duc Thuan
+ Nếu định nghĩa đơn vị dữ liệu lớn thì số giao tác thực hiện giảm nhưng sẽ không có thuận lợi
trong việc giải quyết tranh chấp Ví dụ nếu đơn vị dữ liệu là bảng -> nhiều người cùng truy xuất
trên bảng thì giao tác sau phải chờ giao tác trước nhả bảng ra
+ Nếu định nghĩa đơn vị dữ liệu nhỏ thì nhiều giao tác được thực hiện đồng thời Ví dụ đơn vị dữ
liệu là bộ thì việc truy xuất của người sử dụng trên các bộ khác nhau có thể chấp nhận được
- Các thao tác trên đơn vị dữ liệu A:Đọc, Ghi
2 Một số tính chất khi thao tác trên đơn vị dữ liệu:
a Hai thao tác tương thích:
- Hai thao tác Oi và Oj (OiỴ Ti, Oj Ỵ Tj) gọi là tương thích nếu và chỉ nếu kết quả của việc
thực hiện đồng thời của Oi và Oj giống như kết quả của việc thực hiện tuần tự Oi rồi đến Oj hoặc
Oj rồi đến Oi
Ø Ví dụ:
T1 T2 Read A à a1 Read A à a2 a1 + 1 à a1 a2 * 2 à a2
11
O
Print a1 Print a2
21
O
Read A à a1 Read A à a2 a1 + 5 à a1 a2 * 2 à a2
12
O
Write a1 à A Write a2 à A
22
O
Read A à a1 Read A à a2 a1 + 2 à a1 a2 +7 à a2
13
O
Write a1 à A Write a2 à A
23
O
O14 Read B à b1
b1 + 1 à b1 Write b1 à B
- Thao tác O11 và O21là tương thích
- Thao tác O12 và O22không tương thích
- Thao tác O13 và O23 không tương thích
- Thao tác O14tương thích với các thao tác còn lại
Như vậy, có thể rút ra kết luận: hai thao tác trên hai đơn vị dữ liệu là tương thích với nhau; 2
thao tác đọc trên cùng một đơn vị dữ liệu là tương thích
b Hai thao tác khả hoán vị:
- Hai thao tác O i, O j (OiỴ Ti, Oj Ỵ Tj) là khả hoán vị nếu kết quả của việc thực hiện O i, O j
hay O j,O i là như nhau
Ø Ví dụ: Xét ví dụ trên
- Thao tác O11 và O21là khả hoán vị
- Thao tác O12 và O22không khả hoán vị
- Thao tác O13 và O23là khả hoán vị vì cuối cùng giá trị A ß A +9
Trang 5Ng Duc Thuan
- Thao tác O14khả hoán vị với các thao tác còn lại
v Nhận xét:
Ø Các thao tác truy xuất các đơn vị dữ liệu khác nhau thì tương thích và khả hoán vị
Ø Các thao tác truy xuất trên cùng đơn vị dữ liệu:
- Nếu có liên quan đến phép cộng hay trừ thì khả hoán vị
- Read – Read ==> Khả hoán vị
- Read – Write ==> Không có tính khả hoán vị
- Write – Read ==> Không có tính khả hoán vị
- Write – Write ==> Không có tính khả hoán vị
IV Lịch tuần tự – Lịch khả tuần tự:
1 Lịch tuần tự (serial schedule):
- Một lịch S được lập từ n giao tác T1, T2,…, Tn xử lí đồng thời được gọi là lịch tuần tự nếu các
thao tác của từng giao tác được thực hiện liên tiếp nhau
2 Lịch khả tuần tự (serializable schedule):
- Một lịch S được lập từ n giao tác T1, T2,…, Tn xử lí đồng thời được gọi là lịch khả tuần tự nếu
nó cho cùng kết quả với một lịch tuần tự được lập từ n giao tác trên
Ø Ví dụ: 2 giao tác T1 và T2 có các thao tác sau:
T1 T2 Read A à a1 Read A à a2 a1 + 1 à a1 a2 * 2 à a2 Write a1 à A Write a2 à A Read B à b1 Read B à b2 b1 + 1 à b1 b2 * 2 à b2 Write b1 à B Write b2 à B
Lịch 1 (A=1, B=2) Lịch 2 (A=1, B=2) T1 T2 T1 T2
Read A à a1 Read A à a2
a1 + 1 à a1 a2 * 2 à a2
Write a1 à A (2) Read A à a1
Read A à a2 a1 + 1 à a1 a2 * 2 à a2 Write a2 à A (2) Write a2 à A (4) Read B à b2 Read B à b1 b2 * 2 à b2
b1 + 1 à b1 Write a1 à A (2)
Write b1 à B (3) Read B à b1
Read B à b2 b1 + 1 à b1 b2 * 2 à b2 Write b1 à B (3) Write b2 à B (6) Write b2 à B (4)
Ø Theo lịch 1, kết quả nhận được hoàn toàn tương tự như khi thực hiện tuần tự T1<T2
+ Lịch 1 có tính khả tuần tự; lịch 2 không có tính khả tuần tự
Trang 6Ng Duc Thuan
- Tính khả tuần tự của các giao tác là điều kiện đủ để tránh đụng độ trong việc truy xuất đồng
thời (nếu khả tuần tự thì không đụng độ, nhưng nếu không khả tuần tự thì chưa chắc có đụng
độ)
- Bộ lập lịch (Scheduler): là một bộ phận của DBMS chịu trách nhiệm lập lịch khả tuần tự từ n
giao tác xử lí đồng thời, sẽ tiến hành lập lịch các thao tác (thao tác sẽ được thực hiện trước, thao
tác nào sẽ được thực hiện sau)
3 Thuật toán kiểm tra tính khả tuần tự của một lịch S:
Input: Lịch S bất kỳ được hình thành từ n giao tác T1, T2,…, Tn
Output: Xác định xem S có khả tuần tự hay không bằng cách xây dựng một đồ thị có hướng
G:
- Mỗi giao tác Ti là một node
- Nếu có 1 giao tác Ti phát ra yêu cầu Read(X) và sau đó có một giao tác Tj (j ¹ i) phát ra
yêu cầu Write (X) thì hình thành cung đi từ Ti đến Tj
- Nếu có 1 giao tác Ti phát ra yêu cầu Write(X) và sau đó có một giao tác Tj (j ¹ i) phát ra
yêu cầu Write (X) / Read (X) thì hình thành cung đi từ Ti đến Tj
- Nếu đồ thị G có chu trình thì S không khả tuần tự
Ví dụ: Xét tính khả tuần tự của lịch thao tác sau:
T1 T2 T3 T4
(1) Read A
(2) Read A (3) Write B
(4) Write A (5) Read B
(6) Read B (7) Read A
(8) Write B
(9) Write A Đồ thị có chu trình T1® T4® T1 nên không khả tuần tự
Trang 7Ng Duc Thuan
V Kỹ thuật sắp xếp các giao tác bằng nhãn thời gian:
Ø Chỉ sắp xếp thứ tự các giao tác (thời gian bắt đầu), không nhằm sắp xếp trình tự thực hiện các
thao tác trong mỗi giao tác
1 Khái niệm nhãn thời gian (timestamp)
- Là 1 con số được phát sinh bởi bộ lập lịch, được gán cho mỗi giao tác để chỉ định thời điểm
bắt đầu thực hiện giao tác Nhãn thời gian có tính chất duy nhất và tăng dần
(
j
i i Tj T
j
i T t t
T < Û < )
- Nhãn thời gian của đơn vị dữ liệu: Nhãn thời gian của đơn vị dữ liệu chính là nhãn thời gian
của giao tác cuối cùng có truy cập đến đơn vị dữ liệu đó thành công hoặc là nhãn thời gian cao
nhất trong số các giao tác có truy cập thành công đến đơn vị dữ liệu đó
Ø Ví dụ: T1< T2<T3
T1 T2 T3 t A
Read A t A =t T1
Read A t A =t T2
Read A t A =t T3
2 Thuật toán sắp xếp toàn phần
Procedure Read (T i, A)
Begin
If t A £t Ti ithen
- Thực hiện thao tác đọc g
- t A:=t Ti
Else
Rollback T i và bắt đầu lại với nhãn thời gian mới
End Proc
Procedure Write (T i, A)
Begin
If t A £t Ti ithen
- Thực hiện thao tác ghi g
- t A:=t T i i
Else
Rollback T i và bắt đầu lại với nhãn thời gian mới
End Proc
Ø Ghi chú:
- t A: nhãn thời gian của đơn vị dữ liệu A
- t T i i: nhãn thời gian của giao tác T i
- Ban đầu t A =0 khi chưa có giao tác nào truy cập
Ø Ví dụ 1: t T1 =100,t T2 =120,t A =0
Trang 8Ng Duc Thuan
T1 T2 t A
Read A t A=100
Read A t A=120
A = A+1
A = A+1 Write A t A=120 Write A t A>t T1 nên T1 phải rollback và
bắt đầu lại với timestamp mới
Ø Ví dụ 2: t T1 =100,t T2 =120,t A =0, Trong trường hợp này, rõ ràng không xảy ra đụng độ,
T1 không cần phải rollback và bắt đầu lại với timestamp mới Tuy nhiên, thuật toán sắp
xếp toàn phần không phân biệt tính chất của thao tác dữ liệu là read hay write nên T1
vẫn bị rollback và phải bắt đầu lại
T1 T2 t A
Read A t A=100
Read A t A=120 Read A t A=120 Read A t A>t T1 nên T1 phải rollback và
bắt đầu lại với timestamp mới
Ø Ví dụ 3:
T1 T2 T3 t A t B t C
1
T
t =200 t T2=150 t T3=175 0 0 0
Read A 150
Read C 175 Read B 200
Write B 200
Write A 200
Write C T2 rollback
Write A T3 rollback
v Như vậy:Thuật toán sắp xếp toàn phần: không quan tâm đến tính chất của thao tác dữ liệu
(Read/Write) nên chỉ có 1 nhãn thời gian duy nhất cho 1 đơn vị dữ liệu Nếu quan tâm đến tính
chất của thao tác dữ liệu thì cần 2 nhãn thời gian cho 1 đơn vị dữ liệu tương ứng với thao tác đọc
và ghi trên đơn vị dữ liệu đó
3 Thuật toán sắp xếp từng phần
- Mỗi đơn vị dữ liệu A có 2 nhãn thời gian RTS và WTS Ban đầu, RTS (A)= WTS(A) = 0
- RTS(A) chính là nhãn thời gian của giao tác có timestamp lớn nhất truy cập (read) thành
công lên A
- WTS(A) chính là nhãn thời gian của giao tác có timestamp lớn nhất truy cập (write) thành
công lên A
Trang 9Ng Duc Thuan
Procedure Read (T i, A)
Begin
If WTS (A) <= tTi then
- Thực hiện thao tác đọc g
- RTS(A) :=Max(RTS(A),t Ti)
Else
Rollback T i và bắt đầu lại với nhãn thời gian mới
End Proc
Procedure Write (T i , g )
Begin
If (RTS(A) <= tTi) and ( WTS(A) <= tTi) then
- Thực hiện thao tác ghi g
- WTS(A) := tTi Else
Rollback T i và bắt đầu lại với nhãn thời gian mới
End Proc
Ø Ví dụ:
T1 (t T1=100) T2 (t T2=100) t A t B
Read A t A = 100
Read A t A = 120
A = A+1
A = A+1
Write A t A = 120 Write A T1 rollback
v Nhận xét: Trong thuật toán sắp xếp từng phần, số lượng giao tác bị rollback ít hơn trong
thuật toán sắp xếp toàn phần (do nếu 2 giao tác chỉ thực hiện thao tác “Đọc” thì không gây
ra đụng độ)
T1 T2 Nhận xét
(1) Read A
(2) Read A (3) Read A
Thuật toán sắp xếp toàn phần: T1 bị rollback ở (3) Thuật toán sắp xếp từng phần: không có rollback
T1 T2 Nhận xét
(1) Read A
(2) Write A (3) Read A
Thuật toán sắp xếp toàn phần: T1 bị rollback ở (3) Thuật toán sắp xếp từng phần: T1 bị rollback ở (3)
Trang 10Ng Duc Thuan
VI Điều khiển tương tranh bằng cơ chế khóa (lock):
1 Khái niệm khóa:
- Để thấy được nhu cầu phải sử dụng khóa khi các giao tác thực hiện song song, ta xét ví dụ
sau:
Xét 2 giao tác T1 và T2 Mỗi giao tác truy xuất 1 đơn vị dữ liệu A được giả sử là mang giá trị
số nguyên, rồi cộng thêm 1 vào A Hai giao tác này là các thực hiện của chương trình P dưới
đây:
P: Read (A)
A= A+1
Write (A)
Giá trị của A tồn tại trong CSDL, P đọc A vào vùng làm việc của nó, cộng 1 vào giá trị này
tại đó rồi ghi kết quả vào trong CSDL Trong hình sau, chúng ta thấy 2 giao tác đang thực hiện
theo kiểu xen kẽ, và chúng ta ghi nhận giá trị của A trong CSDL tại mỗi bước:
T 1 Read (A) A=A+1 Write (A)
T 2 Read (A) A=A+1 Write (A)
A trong vùng làm
việc T 1
5 5 6 6 6 6
A trong vùng làm
việc T 2
5 5 6 6
Chúng ta nhận ra rằng mặc dù hai giao tác đều đã cộng thêm 1 vào A, giá trị của A chỉ tăng
1 Vấn đề sẽ nghiêm trọng nếu A biểu thị số ghế đã bán của một chuyến bay
- Phương pháp thông dụng nhất để điều khiển việc truy xuất các đơn vị dữ liệu là sử dụng
khóa (lock) Bộ quản lý khóa (Lock manager) là thành phần của DBMS chịu trách nhiệm theo
dõi xem một đơn vị dữ liệu hiện có giao tác T nào đang đọc hay ghi vào các phần của A hay
không Nếu có thì bộ quản lý khóa sẽ ngăn cản không cho các giao tác khác truy xuất A trong
trường hợp truy xuất (đọc hay ghi) có thể gây ra xung đột
- Như vậy: Lock là 1 đặc quyền truy xuất (access priveleg) lên các đơn vị dữ liệu của các giao
tác mà bộ quản lý khóa có thể trao cho một giao tác hay thu hồi lại Khi 1 giao tác đã khoá
(lock) trên 1 đơn vị dữ liệu nào đó thì các giao tác khác không được phép truy cập đến đơn vị dữ
liệu đó cho đến khi nó nhả khóa (unlock)
- Khi 1 giao tác T thực hiện được việc lock đơn vị dữ liệu A, ta nói, T đang giữ lock A
- Thông thường, tại mỗi thời điểm, chỉ có 1 tập con các đơn vị dữ liệu bị khóa, vì vậy bộ quản
lý khóa có thể lưu các khoá hiện hành trong một bảng khóa (lock table) với các mẫu tin có dạng
sau: (A, L, T) (giao tác T có một khóa kiểu L trên đơn vị dữ liệu A)
2 Kỹ thuật khóa đơn giản:
a Giới thiệu:
- Một giao tác khi có yêu cầu truy xuất đến đơn vị dữ liệu thì phải phát ra yêu cầu xin khóa
(lock) trên đơn vị dữ liệu đó, nếu yêu cầu này được chấp thuận thì được quyền thao tác, và như
vậy các giao tác khác sẽ không được phép truy cập đến đơn vị dữ liệu đó cho đến khi giao tác
giữ khóa được unlock
Ø Ví dụ: Xét lại ví dụ trên được viết với các khóa như sau: