Theo mặc định, Oracle sử dụng cấp hàng ổ khóa.
Các khóa này chỉ chặn đối với người viết (cập nhật, xóa, chèn, v.v.). Điều đó có nghĩa là lựa chọn sẽ hoạt động mọi lúc khi một bảng được cập nhật nhiều, xóa khỏi, v.v.
Ví dụ:giả sử là tableA (số col1, số col2), với dữ liệu này bên trong nó:
col1 | col2
1 | 10
2 | 20
3 | 30
Nếu người dùng John gặp sự cố lúc time1
:
update tableA set col2=11 where col1=1;
sẽ khóa hàng 1.
Tại time2
người dùng Đánh dấu vấn đề một
update tableA set col2=22 where col1=2;
bản cập nhật sẽ hoạt động vì hàng 2 không bị khóa.
Bây giờ bảng sẽ được tìm thấy trong cơ sở dữ liệu:
col1 | col2
1 | 11 --locked by john
2 | 22 --locked by mark
3 | 30
Đối với bảng Mark là (anh ta không thấy các thay đổi không giới hạn)
col1 | col2
1 | 10
2 | 22
3 | 30
Đối với bảng John là:(anh ta không nhìn thấy những thay đổi không giới hạn)
col1 | col2
1 | 11
2 | 20
3 | 30
Nếu dấu thử vào lúc time3
:
update tableA set col2=12 where col1=1;
phiên của anh ấy sẽ bị treo cho đến time4
khi nào John sẽ đưa ra một commit
. (Khôi phục cũng sẽ mở khóa các hàng, nhưng các thay đổi sẽ bị mất)
bảng là (trong db, tại thời điểm4):
col1 | col2
1 | 11
2 | 22 --locked by mark
3 | 30
Immediatley, sau cam kết của John, row1 được mở khóa và bản cập nhật của mark sẽ thực hiện công việc:
col1 | col2
1 | 12 --locked by mark
2 | 22 --locked by mark
3 | 30
hãy đánh dấu phát hành một rollbak tại thời điểm5:
col1 | col2
1 | 11
2 | 20
3 | 30
Trường hợp chèn đơn giản hơn, vì các hàng được chèn bị khóa, nhưng người dùng khác cũng không nhìn thấy vì chúng không được cam kết. Khi người dùng cam kết, anh ta cũng giải phóng các khóa, do đó, những người dùng khác có thể xem các hàng này, cập nhật hoặc xóa chúng.
CHỈNH SỬA :Như Jeffrey Kemp đã giải thích, khi bạn có PK (nó được triển khai trong Oracle với một chỉ mục duy nhất), nếu người dùng cố gắng chèn cùng một giá trị (do đó, chúng tôi sẽ có một bản sao), việc khóa sẽ xảy ra trong chỉ mục . Phiên thứ hai sẽ bị chặn cho đến khi phiên đầu tiên kết thúc vì nó cố gắng viết ở cùng một nơi. Nếu phiên đầu tiên cam kết, phiên thứ hai sẽ ném khóa chính bị vi phạm ngoại lệ và sẽ không thay đổi cơ sở dữ liệu. Nếu phiên đầu tiên thực hiện khôi phục, phiên thứ hai sẽ thành công (nếu không có vấn đề nào khác xuất hiện).
(NB:Trong lời giải thích này của người dùng John, ý tôi là phiên do người dùng John bắt đầu.)