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;
=>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.
Khi thực hiện commit trên user1 thì ngay lập tức user2 được thực hiện
=> để 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);
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