8/25/2017<br />
<br />
Nội dung<br />
1. Các vấn đề trong truy xuất đồng thời<br />
2. Cách giải quyết vấn đề<br />
3. Chế độ khóa<br />
<br />
Chương 5.<br />
Xử lý truy xuất đồng thời<br />
GV: Lê Thị Minh Nguyện<br />
Email: nguyenltm@huflit.edu.vn<br />
<br />
Hệ quản trị Cơ sở dữ liệu<br />
<br />
2<br />
<br />
1. Các vấn đề trong truy xuất đồng thời<br />
<br />
1.1. Mất dữ liệu đã cập nhật (lost updated)<br />
<br />
1.1. Mất dữ liệu đã cập nhật (lost updated)<br />
<br />
Xét 2 giao tác<br />
T1<br />
<br />
T2<br />
Read(A)<br />
A:=A+10<br />
Write(A)<br />
<br />
1.2. Không thể đọc lại (unrepeatable read)<br />
1.3. “Bóng ma” (phantom)<br />
<br />
Read(A)<br />
A:=A+20<br />
Write(A)<br />
<br />
Giả sử T1 và T2 được thực hiện đồng thời<br />
<br />
1.4. Đọc dữ liệu chưa chính xác (dirty read)<br />
<br />
Dữ liệu đã cập nhật tại t4 của T1<br />
<br />
bị mất vì đã bị ghi chồng lên ở<br />
thời điểm t6<br />
<br />
A=50 T1<br />
t1<br />
Read(A)<br />
t2<br />
A:=A+10<br />
t3<br />
Write(A)<br />
t4<br />
t5<br />
t6<br />
A=60<br />
<br />
Hệ quản trị Cơ sở dữ liệu<br />
<br />
3<br />
<br />
Hệ quản trị Cơ sở dữ liệu<br />
<br />
T2<br />
Read(A)<br />
<br />
A:=A+20<br />
Write(A)<br />
<br />
A=70<br />
4<br />
<br />
1<br />
<br />
8/25/2017<br />
<br />
1.1. Mất dữ liệu đã cập nhật (lost updated) (tt)<br />
<br />
1.1. Mất dữ liệu đã cập nhật (lost updated) (tt)<br />
<br />
Tình trạng xảy ra khi hai hay nhiều thao tác của các giao tác<br />
khác nhau cùng yêu cầu truy cập một mục dữ liệu. Các dữ<br />
liệu đã được các thao tác trước cập nhật nhưng lại bị các thao<br />
tác sau cập nhật lại làm thay đổi kết quả mong muốn.<br />
<br />
• Ví dụ: nhà sách còn 500 cuốn sách:<br />
Từ lúc T1 nhân viên A yêu cầu mua 400 cuốn sách từ khách hàng X.<br />
Cũng từ T1 nhân viên B yêu cầu mua 300 cuốn từ khách hàng Y.<br />
A và B đọc dữ liệu thấy 500 cuốn nên đều đồng ý bán.<br />
Vào lúc T2 nhân viên A sẽ thực hiện cập nhật số sách từ 500 thành 100.<br />
Vào lúc T3 nhân viên B sẽ cập nhật số sách từ 500 thành 200<br />
<br />
• Như vậy thao tác cập nhật của A không có tác dụng hay dữ liệu của A cập<br />
nhật sẽ bị mất vì B cập nhật sau.<br />
Hệ quản trị Cơ sở dữ liệu<br />
<br />
5<br />
<br />
• Xét 2 giao tác<br />
<br />
• Ví dụ: giả sử nhà sách còn 200 cuốn sách.<br />
T2<br />
<br />
Read(A)<br />
A:=A+10<br />
Write(A)<br />
<br />
6<br />
<br />
1.2. Không thể đọc lại (unrepeatable read) (tt)<br />
<br />
1.2. Không thể đọc lại (unrepeatable read)<br />
T1<br />
<br />
Hệ quản trị Cơ sở dữ liệu<br />
<br />
Vào lúc T1 nhân viên A bán cho khách 150 cuốn, sẽ thực hiện cập nhật sách từ<br />
200 thành 50. (giao dịch chưa hoàn thành chẳng hạn vì việc giao nhận tiền chưa<br />
xong).<br />
Sau đó lúc T2, B nhận được yêu cầu mua 100 cuốn sách, nếu B đọc được dữ liệu<br />
chưa hoàn tất thì B sẽ từ chối bán 100 cuốn sách này.<br />
Nếu vào lúc T3 vì lý do nào đó chẳng hạn không đủ tiền khách hàng của A<br />
không mua 150 cuốn sách nữa. Giao tác bán hàng của A sẽ không thực hiện nên<br />
quay về trạng thái số sách còn lại là 200<br />
Nhưng B từ chối khách hàng.<br />
Nếu B không đọc được dữ liệu từ lúc T1 đến T3 thì sẽ như thế nào?<br />
<br />
Read(A)<br />
Print(A)<br />
Read(A)<br />
Print(A)<br />
<br />
• Giả sử T1 và T2 được thực hiện đồng thời<br />
A=50<br />
<br />
• T2 tiến hành đọc A hai lần thì<br />
cho hai kết quả khác nhau<br />
<br />
t1<br />
<br />
T2<br />
<br />
Read(A)<br />
Read(A)<br />
<br />
A=50<br />
<br />
Print(A)<br />
<br />
A=50<br />
<br />
t6<br />
<br />
Read(A)<br />
<br />
A=60<br />
<br />
t7<br />
<br />
Print(A)<br />
<br />
A=60<br />
<br />
t2<br />
t3<br />
<br />
A:=A+10<br />
<br />
t4<br />
t5<br />
<br />
Hệ quản trị Cơ sở dữ liệu<br />
<br />
T1<br />
<br />
Write(A)<br />
<br />
7<br />
<br />
Hệ quản trị Cơ sở dữ liệu<br />
<br />
8<br />
<br />
2<br />
<br />
8/25/2017<br />
<br />
1.3. “Bóng ma” (phantom)<br />
<br />
Đọc dữ liệu chưa chính xác (dirty read)<br />
<br />
• Xét 2 giao tác T1 và T2 được xử lý đồng thời<br />
<br />
• Xét 2 giao tác T1 và T2 được xử lý đồng thời<br />
<br />
• A và B là 2 tài khoản<br />
• T1 rút 1 số tiền ở tài khoản A rồi đưa vào tài khoản B<br />
• T2 kiểm tra đã nhận đủ tiền hay chưa?<br />
A=70, B=50<br />
<br />
T1<br />
<br />
• T2 đã đọc dữ liệu được ghi<br />
bởi T1 nhưng sau đó T1 yêu<br />
cầu hủy việc ghi<br />
<br />
T2<br />
<br />
t1<br />
<br />
Read(A)<br />
<br />
t2<br />
<br />
A:=A-50<br />
<br />
t3<br />
<br />
Write(A)<br />
<br />
A=70<br />
<br />
T1<br />
t1<br />
<br />
Read(A)<br />
<br />
t2<br />
<br />
A:=A+10<br />
<br />
t3<br />
<br />
Write(A)<br />
<br />
A=20<br />
<br />
t5<br />
<br />
t4<br />
<br />
A=20<br />
<br />
t6<br />
<br />
t5<br />
<br />
Read(B)<br />
<br />
B=50<br />
<br />
Print(A+B)<br />
<br />
A+B=70<br />
<br />
t6<br />
t7<br />
<br />
Read(B)<br />
<br />
t8<br />
<br />
B:=B+50<br />
<br />
t9<br />
<br />
Write(B)<br />
<br />
Read(A)<br />
<br />
t4<br />
Read(A)<br />
<br />
T2<br />
<br />
Print(A)<br />
Abort<br />
<br />
mất 50 ???<br />
<br />
Hệ quản trị Cơ sở dữ liệu<br />
<br />
9<br />
<br />
2. Cách giải quyết vấn đề<br />
<br />
Hệ quản trị Cơ sở dữ liệu<br />
<br />
10<br />
<br />
3. Chế độ khóa<br />
<br />
• Các hệ quản trị CSDL thương mại đã làm hết rồi!!!!!!<br />
• Thực hiện cơ chế Transaction và cơ chế khoa<br />
• Trước khi transaction đọc hoặc chỉnh sửa dữ liệu, nó cần<br />
được bảo vệ và tránh ảnh hưởng của các transaction khác<br />
đang chỉnh sửa cùng dữ liệu.<br />
<br />
3.1. Các cấp độ khóa<br />
3.2. Các mức cô lập cho giao tác<br />
3.3. Live lock<br />
<br />
3.4. Dead lock<br />
<br />
Hệ quản trị Cơ sở dữ liệu<br />
<br />
11<br />
<br />
Hệ quản trị Cơ sở dữ liệu<br />
<br />
12<br />
<br />
3<br />
<br />
8/25/2017<br />
<br />
3.1. Các cấp độ khóa<br />
<br />
3.1. Các cấp độ khóa (tt)<br />
• Các kiểu lock<br />
• Binary Locks<br />
<br />
• Các mức Locking<br />
• Database level<br />
• Table level<br />
<br />
• Có 2 trạng thái: locked (1) or unlocked (0).<br />
<br />
• Page level<br />
<br />
• Nếu 1 object bị lock bởi 1 transaction, không transaction nào<br />
được sử dụng object đó<br />
<br />
• Row level<br />
• Field (attribute) level<br />
<br />
• Nếu 1 object là unlocked, bất kỳ transaction nào cũng có thể<br />
lock object đó để sử dụng<br />
<br />
Bất kể mức khóa nào DBMS có thể<br />
dùng 2 loại khóa khác nhau: Binary và<br />
Shared / Exclusive<br />
<br />
• 1 transaction phải “unlock”object sau khi hoàn tất.<br />
<br />
Hệ quản trị Cơ sở dữ liệu<br />
<br />
13<br />
<br />
Ví dụ<br />
<br />
14<br />
<br />
Hệ quản trị Cơ sở dữ liệu<br />
<br />
14<br />
<br />
3.1. Các cấp độ khóa (tt)<br />
S<br />
<br />
T1<br />
<br />
T2<br />
<br />
• Các kiểu lock<br />
• Shared Locks<br />
<br />
Lock(A)<br />
Read(A,t)<br />
t:=t+100<br />
Write(A,t)<br />
Unlock(A)<br />
<br />
• Một shared lock tồn tại khi các transaction đồng thời đọc dữ<br />
liệu<br />
<br />
Lock(A)<br />
Read(A,s)<br />
s:=s*2<br />
Write(A,s)<br />
Unlock(A)<br />
Lock(B)<br />
Read(B,s)<br />
s:=s*2<br />
Write(B,s)<br />
Unlock(B)<br />
<br />
• Một shared lock không làm đụng độ dữ liệu khi các transaction<br />
đồng thời chỉ đọc dữ liệu<br />
• Một shared lock được gán khi transaction muốn đọc dữ liệu và<br />
dữ liệu đó không tồn tại exclusive lock.<br />
<br />
Lock(B)<br />
Read(B,t)<br />
t:=t+100<br />
Write(B,t)<br />
Unlock(B)<br />
Hệ quản trị Cơ sở dữ liệu<br />
<br />
15<br />
<br />
Hệ quản trị Cơ sở dữ liệu<br />
<br />
16<br />
<br />
4<br />
<br />
8/25/2017<br />
<br />
3.1. Các cấp độ khóa (tt)<br />
<br />
3.1. Các cấp độ khóa (tt)<br />
<br />
• Các kiểu lock<br />
• Exclusive Locks<br />
<br />
• Các kiểu lock<br />
• Exclusive Locks<br />
<br />
• Tồn tại khi transaction ghi dữ liệu<br />
<br />
• Tồn tại khi transaction ghi dữ liệu<br />
<br />
• Được sử dụng khi có khả năng đụng độ dữ liệu<br />
<br />
• Được sử dụng khi có khả năng đụng độ dữ liệu.<br />
<br />
• Một exclusive lock sẽ được gán khi transaction muốn ghi dữ<br />
liệu và dữ liệu đó chưa bị lock<br />
<br />
• Một exclusive lock sẽ được gán khi transaction muốn ghi dữ<br />
liệu và dữ liệu đó chưa bị lock<br />
<br />
• Được dùng cho thao tác sửa đổi dữ liệu như lệnh INSERT,<br />
UPDATE hay DELETE. Bảo đảm là nhiều lệnh cập nhật không<br />
thực hiện trên cùng 1 tài nguyên cùng 1 lúc<br />
<br />
• Được dùng cho thao tác sửa đổi dữ liệu như lệnh INSERT,<br />
UPDATE hay DELETE. Bảo đảm là nhiều lệnh cập nhật không<br />
thực hiện trên cùng 1 tài nguyên cùng 1 lúc<br />
<br />
Hệ quản trị Cơ sở dữ liệu<br />
<br />
17<br />
<br />
Hệ quản trị Cơ sở dữ liệu<br />
<br />
3.1. Các cấp độ khóa (tt)<br />
<br />
3.2. Các mức cô lập cho giao tác<br />
<br />
• Các kiểu lock<br />
• Exclusive Locks<br />
<br />
• Read Uncommitted<br />
<br />
• Ví dụ: nếu lệnh Update sửa đổi các hàng trong một bảng mà<br />
lệnh này có kết nối (join) với 1 bảng khác thì sẽ cần bao<br />
nhiêu khóa?<br />
<br />
• Một khóa shared cho các hàng đọc được trong bảng kết nối<br />
• Một khóa exclusive cho các hàng được cập nhật trong bảng<br />
update.<br />
<br />
Hệ quản trị Cơ sở dữ liệu<br />
<br />
19<br />
<br />
18<br />
<br />
• Read Committed<br />
• Repeatable Read<br />
<br />
• Serializable<br />
<br />
Hệ quản trị Cơ sở dữ liệu<br />
<br />
20<br />
<br />
5<br />
<br />