Concurrency TRANSACTION và xử lý deadlock

Concurrency Transaction (Giao dịch đồng thời) là khái niệm trong cơ sở dữ liệu liên quan đến khả năng xử lý nhiều giao dịch cùng một lúc mà không làm thay đổi tính nhất quán của cơ sở dữ liệu. Trong môi trường đa người dùng, nhiều giao dịch có thể cùng tồn tại và thực hiện đồng thời trên cơ sở dữ liệu. Điều này tạo ra tình huống mà một giao dịch có thể làm thay đổi dữ liệu mà giao dịch khác đang sử dụng, và ngược lại.

Khi có giao dịch đồng thời xảy ra trên bảng thì hệ thống sẽ phát hiện và tự động lock bảng đó lại cho đến khi user thực hiện commit xảy ra để đảm bảo tính nhất quán của dữ liệu => nghĩa là 1 record thì sẽ chỉ có 1 user được update trong 1 thời điểm mà thôi.

Giả sử chúng ta có bảng duong.table và có 2 user cùng update trên bảng này:

create table duong.table11 (id number, data varchar(50));

insert into duong.table11 values (1, ‘cong hoa’);

insert into duong.table11 values (2,’Xa hoi’);

Chúng ta có 2 user:

create user user1 identified by oracle;

grant connect, resource, dba to user1;

create user user2 identified by oracle;

grant connect, resource, dba to user2;

select * from duong.table11;

Thực hiện truy vấn:

–table User1

update duong.table11 set data =’chinh chu’ where id= 1;

–table User2

update duong.table11 set data =’viet nam’ where id= 1;

word image 2345 1

word image 2345 2

=>user2 bị treo ??? lệnh ko thực hiện được nữa rồi.

Nguyên nhân: 2 user cùng update chung 1 trường dữ liệu trong khi user thực hiện chưa xong, hoặc xong rồi nhưng mà chưa thực hiện commit để giải phóng tài nguyên => để đảm bảo toàn vẹn dữ liệu thì oracle lock row đó lại

Xử lý: thưc hiện commit trên user 1 là xong.

word image 2345 3

Khi thực hiện commit trên user1 thì ngay lập tức user2 được thực hiện

word image 2345 4

=> để tránh lock thì chúng ta phải thực hiện commit ngay sau khi thực thi xong lệnh

Ví dụ tiếp theo: update chéo nhau (deadlock)

–table User1

update duong.table11 set data =’chinh chu’ where id= 1;

–table User2

update duong.table11 set data =’viet nam’ where id= 2;

–table User1

update duong.table11 set data =’chinh chu’ where id= 2;

–table User2

update duong.table11 set data =’viet nam’ where id= 1;

Ở trường hợp trên => khi user1 thực hiện commit xong nhưng user2 chưa thực hiện commit mà user1 lại tiếp tục update id=1 thì cả user1 và 2 đều bị lock => gọi là deadlock

Kiểm tra deadlock:

SELECT sid, serial#, username

FROM v$session WHERE sid IN

(SELECT blocking_session FROM v$session);

word image 2345 5

chúng ta thấy rằng là user1 đang giữ lock

ERROR at line 1:

ORA-00060: deadlock detected while waiting for resource

Để xử ly deadlock thì chúng ta phải KILL session đang giữ lock

ALTER SYSTEM KILL SESSION ‘255,3245’ immediate;

=> sau khi chạy lệnh trên thì ngay lập tức sẽ giải phóng row và hết lock

 

0 0 đánh giá
Đánh giá bài viết
Theo dõi
Thông báo của
guest

0 Góp ý
Phản hồi nội tuyến
Xem tất cả bình luận