Tải bản đầy đủ - 0 (trang)
Chương 5: XỬ LÝ TRUY XUẤT ĐỒNG THỜI

Chương 5: XỬ LÝ TRUY XUẤT ĐỒNG THỜI

Tải bản đầy đủ - 0trang

Đề tài Hệ thống Quản lý thư viện



GVHD: ThS. Đỗ Thị Minh Phụng



 Tạo Exclusive Lock trên đơn vị dữ liệu được ghi, Exclusive Lock được

giữ cho đến hết giao tác

 Ưu điểm

 Giải quyết vấn đề Dirty Reads và Unrepeatable Reads

 Nhược điểm

 Chưa giải quyết được vấn đề Phantoms, do vẫn cho phép insert những

dòng dữ liệu thỏa điều kiện thiết lập shared lock.

 Phải chờ nếu đơn vị dữ liệu cần đọc đang được giữ khoá ghi (lock)

 Shared lock được giữ đến hết giao tác ==> cản trở việc cập nhật dữ liệu

của các giao tác khác



5.1.2. READ COMMITED



Trong Read Committed, mọi truy vấn được thực hiện bởi một Transaction

chỉ nhìn thấy dữ liệu đã được commit. Mức cơ lập này là mặc định. Nó phù

hợp với mơi trường cơ sở dữ liệu trong đó ít Transaction có khả năng xung

đột. Xung đột ghi trong Read Committed:

 Trong Read Committed, một xung đột ghi xảy ra khi transaction cố

gắng thay đổi một dòng đã được cập nhật bởi một transaction khác mà chưa

được commit hay rollback.

 Transaction ngăn chặn sửa đổi dòng được gọi là blocking transaction.

Transaction Read Committed chờ blocking transaction kết thúc và giải

phóng khóa rồi transaction Read Committed mới lấy được khóa và thực hiện

thay đổi.

 Đặc điểm

 Đây là mức độ cô lập mặc định

 Tạo Shared Lock trên đơn vị dữ liệu được đọc, Shared Lock được

giải phóng ngay sau khi đọc xong dữ liệu

 Tạo Exclusive Lock trên đơn vị dữ liệu được ghi, Exclusive Lock

được giữ cho đến hết giao tác

61



Đề tài Hệ thống Quản lý thư viện



GVHD: ThS. Đỗ Thị Minh Phụng



 Ưu điểm

 Giải quyết vấn đề Dirty Reads

 Shared Lock được giải phóng ngay, khơng cần phải giữ cho đến hết

giao tác nên không cản trở nhiều đến thao tác cập nhật của các giao

tác khác

 Nhược điểm

 Chưa giải quyết được vấn đề Unrepeatable Reads, Phantoms, Lost

Updates

 Phải chờ nếu đơn vị dữ liệu cần đọc đang được giữ khoá ghi

(xlock)

5.2.3. READ UNCOMMITTED



 Đặc điểm

 Không thiết lập Shares Lock trên những đơn vị dữ liệu cần đọc.

 Do đó khơng phải chờ khi đọc dữ liệu (kể cả khi dữ liệu đang bị

lock bởi giao tác khác)

 Vẫn tạo Exclusive Lock trên đơn vị dữ liệu được ghi, Exclusive

Lock được giữ cho đến hết giao tác

 Ưu điểm

 Tốc độ xử lý rất nhanh

 Không cản trở những giao tác khác thực hiện việc cập nhật dữ liệu

 Nhược điểm

 Có khả năng xảy ra mọi vấn đề khi xử lý đồng thời: Dirty Reads,

Unrepeatable Reads, Phantoms, Lost Updates

5.1.3. SERIALIZABLE



Ở mức cô lập tuần tự (serializable isolation level), transaction chỉ thấy

những thay đổi đã được commit trước thời điểm transaction có mức cơ lập

62



Đề tài Hệ thống Quản lý thư viện



GVHD: ThS. Đỗ Thị Minh Phụng



tuần tự này bắt đầu và các thay đổi được thực hiện bởi chính transaction này.

- Một transaction tuần tự hoạt động trong một mơi trường chỉ một mình nó

như thể khơng có người dùng nào khác đang sửa đổi dữ liệu trong cơ sở dữ

liệu. mức cô lập tuần tự phù hợp với các môi trường:

 Với cơ sở dữ liệu lớn và các transaction ngắn chỉ cập nhật một vài

dòng.

 Trường hợp có 2 transaction đồng thời sửa đổi cùng 1 dòng là tương

đối thấp.

 Trường hợp các transaction tương đối dài chủ yếu chỉ đọc.

Ở mức cơ lập tuần tự, Bất kỳ dòng nào được đọc bởi transaction tuần tự

được đảm bảo giống nhau khi đọc lại. Bất kỳ truy vấn nào cũng được đảm

bảo trả về cùng kết quả trong suất thời gian transaction đó hoạt động, do đó,

những thay đổi được thực hiện bởi transaction khác sẽ không hiển thị đối

với truy vấn của transaction tuần tự bất kể những thay đổi của transaction

khác đã chạy được bao lâu. Transaction tuần tự (serializable) ngăn ngừa

được Dirty reads, Nonrepeatable reads, Phantom reads.

 Đặc điểm

 Tạo Shared Lock trên đơn vị dữ liệu được đọc và giữ shared lock

này đến hết giao tác => Các giao tác khác phải chờ đến khi giao

tác này kết thúc nếu muốn cập nhật, thay đổi giá trị trên đơn vị dữ

liệu này.

 Khơng cho phép Insert những dòng dữ liệu thỏa mãn điều kiện

thiết lập Shared Lock (sử dụng Key Range Lock) ==> Serializable

= Repeatable Read + Giải quyết Phantoms

 Tạo Exclusive Lock trên đơn vị dữ liệu được ghi, Exclusive Lock

được giữ cho đến hết giao tác.

 Ưu điểm

 Giải quyết thêm được vấn đề Phantoms

 Nhược điểm

 Phải chờ nếu đơn vị dữ liệu cần đọc đang được giữ khoá ghi

(xlock)

 Cản trở nhiều đến việc cập nhật dữ liệu của các giao tác khác

63



Đề tài Hệ thống Quản lý thư viện



GVHD: ThS. Đỗ Thị Minh Phụng



5.1.4. LOCKING READS



Nếu truy vấn dữ liệu và sau đó ghi mới hoặc cập nhật dữ liệu liên quan

trong cùng một transaction thì lệnh SELECT thơng thường khơng đủ bảo vệ

nhất quán dữ liệu. Những transaction khác có thể cập nhật hoặc xóa những

dòng dữ liệu mà vừa truy vấn. InnoDB hỗ trợ 2 loại locking reads đảm bảo

sự an toàn dữ liệu cao hơn.

SELECT … LOCK IN SHARE MODE: thiết lập khóa đọc trên bất cứ dòng

nào mà nó đọc. Những session khác có thể đọc những dòng dữ liệu đó

nhưng khơng thể cập nhật chúng cho đến khi transaction đang thực thi

commit. Nếu có bất cứ dòng dữ liệu nào đang được thay đổi bởi một

transaction khác, lệnh truy vấn của bạn phải đợi cho đến khi transaction đó

kết thức và sử dụng giá trị mới nhất của chúng.

SELECT … FOR UPDATE khóa những dòng dữ liệu và bất cứ những dòng

liên quan giống như lệnh UPDATE. Những transaction khác bị cấm trong

việc cập nhật, SELECT … LOCK IN SHARE MODE hoặc đọc những dữ

liệu này ở bất kỳ mức cơ lập nào. Consistent read bỏ qua các khóa được

thiết lập.

Tất cả các khóa được thiết lập bởi LOCK IN SHARE MODE và FOR

UPDATE sẽ được giải phóng khi transaction commit hoặc roll back.

Hệ quản trị có thể thực thi một vài cơ chế khóa, tùy vào các thao tác khác

nhau lên dữ liệu.

Nhìn chung, hệ quản trị sử dụng 2 loại chính: exclusive locks (khóa độc

quyền) và share locks (khóa chia sẻ). Tại một thời điểm, chỉ có 1 excusive

lock được thực thi trên 1 đơn vị dữ liệu, nhưng nhiều share locks có thể

cùng thực thi trên 1 đơn vị dữ liệu.

Cơ chế khóa tác động đến sự tương tác giữa việc đọc và ghi dữ liệu:

 Một dòng dữ liệu chỉ bị khóa khi nó đang được thay đổi bởi việc

hành động ghi. Khi có 1 câu truy vấn cập nhật dữ liệu của 1 dòng, hệ

quản trị sẽ khóa dòng đó lại.

 Một hành động ghi lên 1 dòng dữ liệu sẽ ngăn chặn các hành động

khác cùng đồng thời ghi lên dòng dữ liệu đó.

 Hành động đọc dữ liệu khơng ngăn cản hành động ghi: Vì hành động

đọc khơng khóa đơn vị dữ liệu nó đang đọc, nên hành động ghi có thể

thao tác lên đơn vị dữ liệu này. Chỉ có một trường hợp ngoại lệ là câu

lệnh Select … for update sẽ lock đơn vị dữ liệu nó đang đọc.

64



Đề tài Hệ thống Quản lý thư viện



GVHD: ThS. Đỗ Thị Minh Phụng



 Hành động ghi dữ liệu không ngăn cản hành động đọc: Khi một đơn

vị dữ liệu đang được thao tác bởi hành động ghi, hệ quản trị sẽ sử

dụng phiên bản trước đó của đơn vị dữ liệu để trả về cho hành động

đọc.



5.2. Unrepeatable read

Mơ tả tình huống: Trong khi 1 thủ thư đang xem báo cáo tiền phạt của độc giả

thường thì cùng lúc đó 1 thủ thư khác đang thêm một phiếu phạt. Xảy ra tình

huống Unrepeatable read.

*Stored procedure thêm phiếu phạt và cập nhật tiền phạt

CREATE OR REPLACE PROCEDURE sp_themphieuphat(in_maphieuphat

phieuphat.maphieuphat%TYPE,in_madocgia phieuphat.madocgia%TYPE,

in_manhanvien phieuphat.manhanvien

%TYPE,in_masach phieuphat.masach%TYPE,

in_tienphat phieuphat.tienphat

%TYPE,in_ngaytra_pp phieuphat.ngaytra_pp%TYPE,

in_ngayhethan_pp phieuphat.ngayhethan_pp

%TYPE,in_mabaocao baocao.mabaocao%TYPE)

AS

v_maphieuphat phieuphat.maphieuphat%TYPE;

v_loi EXCEPTION;

BEGIN

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

SELECT maphieuphat INTO v_maphieuphat

FROM phieuphat,baocao

WHERE maphieuphat=in_maphieuphat AND mabaocao=in_mabaocao;

IF v_maphieuphat IS NOT NULL THEN RAISE v_loi;

END IF;

EXCEPTION WHEN v_loi THEN

65



Đề tài Hệ thống Quản lý thư viện



GVHD: ThS. Đỗ Thị Minh Phụng



dbms_output.put_line('phieu phat da ton tai');

WHEN no_data_found THEN

INSERT INTO phieuphat VALUES(in_maphieuphat,in_madocgia

,in_manhanvien,in_masach,in_tienphat,in_ngaytra_pp,in_ngayhethan_pp);

dbms_output.put_line('Them thanh cong!');

UPDATE baocao

SET tongtienphat=tongtienphat+ in_tienphat

WHERE mabaocao=in_mabaocao;

COMMIT;

END;



*Stored procedure xem báo cáo

CREATE OR REPLACE PROCEDURE SP_THONGKETIENPHAT

IS

CURSOR C IS SELECT mabaocao,tongTIENPHAT

FROM BAOCAO;

v_mabaocao baocao.mabaocao%TYPE;

v_tien baocao.mabaocao%type;

TONGTIEN BAOCAO.tongtienphat %TYPE;

BEGIN

set transaction isolation level read committed;

SELECT sum(TONGTIENPHAT)

INTO TONGTIEN

FROM BAOCAO;

OPEN C;

LOOP

FETCH C INTO v_mabaocao,v_tien;

66



Đề tài Hệ thống Quản lý thư viện



GVHD: ThS. Đỗ Thị Minh Phụng



EXIT WHEN C%NOTFOUND;

IF C%FOUND THEN

DBMS_OUTPUT.PUT_LINE('mabaocao: '||V_Mabaocao ||'-Tien:'||v_tien);

END IF;

END LOOP;

CLOSE C;

DBMS_OUTPUT.PUT_LINE('TONG TIEN PHAT LA :'||TONGTIEN);

COMMIT;

END;

T1

set transaction

isolation level read

committed;

SELECT

maphieuphat,tienphat

FROM phieuphat;



No action



BEGIN

sp_thongketienphat;

END;



67



T2

No action.

No action.



BEGIN



Explanation

Session 1 thiết lập

transaction 1 với mức cô lập

read committed

T1 truy vấn phiếu phạt và

tiền phạt của từng phiếu phạt

của tháng 3. Hiện tại tổng số

phiếu phạt của tháng 3 là

1( tuowng ứng với tiền phạt

là 50000)



Bắt đầu T2, Gọi thủ tục

sp_themphieuphat thêm

sp_themphieuphat('PP00 phiếu phạt.

5',

'DG003','TT002','MS000

04',

5000,'12/3/2019','30/3/2

019',

'BC002');

END;

No action.

Gọi thủ tục

sp_thongketienphat

Truy vấn tổng tiền phạt

tháng 3 (BC002).Nhận thấy

sai, vì số phiếu phạt là 1 mà

tổng tiêng phạt là 10000.



Đề tài Hệ thống Quản lý thư viện



GVHD: ThS. Đỗ Thị Minh Phụng



Vấn đề xảy ra: T1 thực hiện truy vấn xem số phiếu phạt vào tháng 3 là 1 phiếu

( tương ứng với 5000). Vào lúc này T2 thực hiện thêm một phiếu phạt PP005. Tiếp

đó T1 thực hiện truy vấn thì thấy số tiền phạt cao hơn so với số phiếu phạt.

Nguyên nhân: T1 thiết lập mức cô lập read committed nên mỗi lần UPDATE,

SELECT trong cùng 1 thao tác dữ liệu, nó sẽ đọc lại dữ liệu từ cơ sở dữ liệu(cơ sở

dữ liệu lúc này có thể bị thay đổi) mắc dù những câu lệnh này đọc trên những đơn

vị dữ liệu giống nhau.

Giải pháp: T1 sử dụng câu lệnh “set transaction isolation level serializable” thay

cho câu lệnh “set transaction isolation level read committed”.

Kết quả: Số tiền phạt sẽ được giữ nguyên tương ứng với số phiếu phạt mà đã

SELECT ban đầu. vì lúc này T1 sẽ dùng dữ liệu trước khi T2 thực hiện thêm phiếu

phạt.



5.3. Phantom

Mơ tả tình huống: Khi một thủ thư đang thực hiện việc thống kê tổng số lượng

sách đang có trong thư viện thì một thủ thư khác thực hiện việc thêm sách mới vào

thư viện



68



Đề tài Hệ thống Quản lý thư viện



GVHD: ThS. Đỗ Thị Minh Phụng



create or replace procedure DEM_SACH

as

v_sl number;

begin

set transaction isolation level read committed;

select count (*)

into v_sl

from SACH, PHIEUNHAPSACH, NHAXUATBAN

where SACH.manhap=PHIEUNHAPSACH.manhap and

sach.manxb=nhaxuatban.manxb;

dbms_output.put_line (' SO LUONG SACH CO TRONG THU VIEN:' || v_sl);

commit;

end;



Session 1



Session 2



Explanation



Declare



No action



Session 1 gọi thủ tục

đếm sách, session 1

bắt đầu thực thi câu

lệnh



Begin

DEM_SACH

End;



No action



Declare



Session 2 gọi thủ tục

them_sach_thu_vien

Begin

thêm sách có mã số

them_sach_thu_vien('MS00017','CC001','Tu ‘MS00017’ vào trong

hệ thống thư viện.

Hy Thai Hau ', 'Pearl S. Buck','2009','Da

Bắt đầu session 2

muon','vn','N0007','theloai5','tai ban');

End;



69



Đề tài Hệ thống Quản lý thư viện

PL/SQL

procedure

successfully

completed.



GVHD: ThS. Đỗ Thị Minh Phụng



No action



Transaction 1 thực

hiện thành công và đã

kết thúc



PL/SQL procedure successfully completed.



Transaction 1 thực

hiện thành công và đã

kết thúc



Vấn đề xảy ra: Session 1 đếm số sách trong thư viện trong bảng sách, kết quả là

15. Sau đó session 2 thực hiện thêm mới sách vào bảng sách. Session 1 lại truy

vấn in ra số lượng sách hiện có trong thư viện kết quả là 16.

Nguyên nhân: T1 thiết lập mức cô lập read committed nên lần đếm thứ 2 sẽ tính cả

sách vừa mới thêm vào hệ thống thư viện.

Giải pháp: sử dụng câu lệnh “set transaction isolation level serializable” thay cho

câu lệnh “set transaction isolation level read committed”.



5.4. Deadlock

Tình huống xảy ra deadlock: 2 độc giả mỗi người đều mượn nhiều sách (>1)

giống nhau cùng 1 lúc. Khi đó xảy ra deadlock. Phần mô tả dưới đây lược bỏ

những phần không ảnh hưởng đến deadlock của procedure CHOMUON_SACH.

Transaction 1(độc giả 1)

UPDATE SACH

SET TRANGTHAI='Da

muon'

WHERE

MASACH='MS00004';

1 row updated



UPDATE SACH

SET TRANGTHAI='Da

muon'

WHERE

MASACH='MS00003';



70



Transaction 2(độc giả 2)



Giải thích

Cập nhật trạng thái

sách MS00004, T1

phải xin khóa ghi rồi

tiến hành cập nhật



UPDATE SACH

SET TRANGTHAI='Da

muon'

WHERE

MASACH='MS00003';

1 row updated



Cập nhật trạng thái

sách MS00003, T2

phải xin khóa ghi rồi

tiến hành cập nhật

Cập nhật trạng thái

sách MS00003, T1

phải xin khóa ghi rồi

tiến hành cập nhật.

Nhưng T2 đang giữ

khóa phải chờ T2 nhả

khóa(commit



Đề tài Hệ thống Quản lý thư viện



GVHD: ThS. Đỗ Thị Minh Phụng



transaction)

T1 bị treo

UPDATE SACH

Cập nhật trạng thái

SET TRANGTHAI='Da

sách MS00004, T2

muon'

phải xin khóa ghi rồi

WHERE

tiến hành cập nhật.

MASACH='MS00004';

Nhưng T1 đang giữ

khóa phải chờ T1 nhả

khóa(commit

transaction)

Time out

T2 bị treo

T1 T2 chờ khóa của

ORA-00060: deadlock

nhau nên DBMS bị

detected while waiting for

treo. Sau 1 khoảng

resource

thời gian(Time out)

DBMS tạo ra

exception

rollback

1 row updated

Giải phóng T1, T2 xin

được khóa và hồn

thành giao tác

rollback completed

T1 Hủy

Vấn đề xảy ra: T1 chờ T2 giải phóng khóa đọc, T2 lại chờ T1 giải phóng khóa

ghi. Kết quả dẫn đến hệ quản trị báo lỗi và hủy T2.

Giải quyết: Để giải quyết deadlock, hệ quản trị sẽ tự động rollback transaction có

kích cỡ nhỏ hơn. Kích cỡ của 1 transaction được xác định bởi số dòng insert,

update or delete. Trong trường hợp này, 2 transaction có kích cỡ bằng nhau nên hệ

quản trị sẽ rollback transaction T2 thực hiện sau. Để ngăn ngừa deadlock. Để ngăn

ngừa deadlock ngay sau khi cập nhật trạng thái sách dùng câu lệnh commit để nhả

khóa.



5.5. Lost update

Mơ tả tình huống: Khi thêm 2 hay nhiều độc giả vào cơ sở dữ liệu tại cùng 1 thời

điểm thì có khả năng xảy ra mất dữ liệu khi cập nhật số lượng độc giả.

(CREATE OR REPLACE PROCEDURE ADD_DOCGIA(VTENTK

TAIKHOAN.TENTK%TYPE,VMATKHAU TAIKHOAN.MATKHAU%TYPE,

VLOAITK TAIKHOAN.LOAITK%TYPE, VMADOCGIA DOCGIA.MADOCGIA

%TYPE, VTEN DOCGIA.TEN%TYPE, VNGAYSINH nvarchar2/ VSDT

DOCGIA.SDT%TYPE, VDIACHI DOCGIA.DIACHI%TYPE, VLOP DOCGIA.LOP

%TYPE, VDOITUONG DOCGIA.DOITUONG%TYPE, VGIOITINH

DOCGIA.GIOITINH%TYPE, VMATHE THETHUVIEN.MATHE%TYPE,

VGHICHU THETHUVIEN.GHICHU%TYPE, VEMAIL DOCGIA.EMAIL%TYPE)



71



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Chương 5: XỬ LÝ TRUY XUẤT ĐỒNG THỜI

Tải bản đầy đủ ngay(0 tr)

×