Chào mừng bạn đến với Selfomy Hỏi Đáp, hãy Hỏi bài tập hoặc Tham gia ngay
+1 thích
196 lượt xem
thanhtrong trong Tin học lớp 9 bởi Thạc sĩ (6.2k điểm)
Phân biệt optimistic locking và pessimistic locking như thế nào?

1 Câu trả lời

0 phiếu
tngnhatganh117 bởi Cử nhân (3.4k điểm)

Pessimistic Locking

Hầu hết các Oracle Developers đều rất quen thuốc với pessimistic locking - một default locking trong BC4J. Cơ chế này hoạt động bằng cách lock một row trước khi một attribute của nó được thay đổi thông qua việc gọi đến method setAttribute(). Nếu có bất kì transaction khác cố gắng truy cập vào row đã bị khóa đó, chúng sẽ bị buộc phải chờ cho đến khi transaction đầu tiên hoàn thành. Cơ chế này sử dụng syntax SELECT...FOR UPDATE. Pessimistic locking là cơ chế locking an toàn nhất bởi việc hai transactions sẽ không bao giờ có thể cùng thay đổi một row. Tuy nhiên, chiến lược locking này có một vài nhược điểm như sau:

  1. Nếu một user chọn edit một record, sau đó, anh ra đi ăn trưa mà chưa kết thúc hay hủy bỏ transaction này. Khi đó, tất cả các users khác cần update record này sẽ buộc phải đợi cho đến khi anh ta trở lại và hoàn thành transaction, hoặc cho đến khi DBA kill transaction này và mở locking.
  2. Có thể xảy ra Deadlock. Khi User A và B cùng update vào Database trong cùng một thời gian. User A sẽ khóa lại record đó và cố gắng mở khóa được hình thành bởi User B cũng đang đợi mở khóa mà User A vừa hình thành.

Pessimistic locking không nên sử dụng cho web applications bởi nó sẽ tạo trạng thái transaction đang chờ xử lý trong cơ sở dữ liệu ở dạng row-level locks. Nếu Pessimistic locking được thiết lập, quản lý trạng thái sẽ làm việc, nhưng chế độ locking sẽ không thực hiện như mong đợi.Mỗi khi một module được recycled, một rollback được cấp phát trong kết nối JDBC. Điều này giải phóng tất cả các khóa mà Pessimistic locking đã tạo ra.

Ví dụ về Pessimistic locking dựa trên lược đồ hr nổi tiếng, giả sử User 1 và User 2 là hai người dùng khác nhau (hai giao dịch riêng biệt) sử dụng Pessimistic locking, cả hai đều cố gắng thay đổi cùng một dãy dữ liệu như sau:

  1. User 1 call EmployeesImpl.setSalary (1000) trên một row cụ thể, do đó, user1 ngay lập tức có được một khóa trên row đó.
  2. Bây giờ người User 2 call EmployeesImpl.setSalary (2000) trên một row tương tự, User 2 cố gắng để có được một khóa trên row và nhận được oracle.jbo.AlreadyLockedException.

Optimistic Locking

Optimistic Locking cho phép nhiều giao dịch có thể hoàn thành mà không ảnh hưởng đến nhau. Oracle đã khuyến cáo việc sử dụng Optimistic Locking cho các ứng dụng web. Thay vì khóa một row ngay khi nó được thay đổi, vớiOptimistic Locking, BC4J chờ đợi cho đến khi row thay đổi được posted trước khi cố gắng để có được một khóa. Một exception sẽ không được throw cho đến khi các giao dịch conflict cố gắng post các thay đổi của chúng vào cơ sở dữ liệu.

Ví dụ về Optimistic Locking, giả sử user1 và user2 là hai người dùng khác nhau (hai giao dịch riêng biệt) bằng cách sử dụng Optimistic Locking, cả hai đều cố gắng thay đổi cùng một dãy dữ liệu như sau:

  1. User1 call EmployeesImpl.setSalary (1000) trên một row cụ thể, user1 không ngay lập tức có được một khóa trên hàng đó.
  2. User2 call EmployeesImpl.setSalary (2000) trên một row tương tự. User1 và User2 hiện có bộ nhớ cache entity khác nhau cho cùng một row.
  3. User 2 call commit() action, như một phần của cycle commit, row đã thay đổi được post lên cơ sở dữ liệu. Trước khi hành động update có thể được thực hiện, User 2 đã có được khóa trên row đó. Khóa sẽ hết hạn ngay lập tức, khi lệnh commit được gửi tới cơ sở dữ liệu.
  4. User 1 bây giờ call commit() action, BC4J cố gắng gửi row đã được thay đổi tới cơ sở dữ liệu, ngay trước khi post nó, nó cố gắng để có được khóa trên row đó. BC4J nhận ra rằng row đã được thay đổi bởi người dùng khác và hành động update row sẽ overwrite lên các thay đổi khác của transaction, do đó, nó sẽ throw một oracle.jbo.RowInconsistentException.

Cuối cùng, bạn có thể sử dụng bất kể loại locking nào. Bạn có thể khóa row bất cứ lúc nào bằng cách call EntityImpl.lock () trên đối tượng entity tương ứng, ngay cả khi chế độ locking là optimistic.

Trên đây là sự khác nhau giữa Persimistic locking và optimistic locking. Tùy theo yêu cầu ứng dụng của mình mà các bạn có thể lựa chọn loại locking phù hợp nhất. Hi vọng bài viết này sẽ có ích cho bạn đọc.

Các câu hỏi liên quan

0 phiếu
1 trả lời 881 lượt xem
0 phiếu
2 câu trả lời 1.3k lượt xem
+3 phiếu
9 câu trả lời 2.6k lượt xem
Cây rễ cọc là: a. Cây ngô       b. Cây rau cải               c. Cây mạ                          d. Cây hành
đã hỏi 22 tháng 7, 2018 trong Sinh học lớp 6 bởi trannhat900 Phó giáo sư (52.9k điểm)
0 phiếu
2 câu trả lời 5.1k lượt xem
Phân biệt sóng dọc và sóng ngang ? Cho biết sóng âm thuộc loại sóng nào ?
đã hỏi 8 tháng 7, 2018 trong Vật lý lớp 8 bởi trannhat900 Phó giáo sư (52.9k điểm)
0 phiếu
3 câu trả lời 170 lượt xem
đã hỏi 23 tháng 10, 2023 trong Tin học lớp 9 bởi Khang1000 Phó giáo sư (31.4k điểm)
0 phiếu
1 trả lời 306 lượt xem
đã hỏi 24 tháng 5, 2022 trong Tin học lớp 9 bởi chese4154898 Cử nhân (1.9k điểm)
0 phiếu
0 câu trả lời 484 lượt xem
Phân biệt ArrayList , Linkedlist và Vector?
đã hỏi 21 tháng 12, 2020 trong Tin học lớp 9 bởi thanhtrong Thạc sĩ (6.2k điểm)
+1 thích
2 câu trả lời 964 lượt xem
+1 thích
1 trả lời 229 lượt xem
+1 thích
2 câu trả lời 1.9k lượt xem

HOT 1 giờ qua

  1. trannhat900trannhat900

    52948 Điểm

  2. phamngoctienpy1987844phamngoctienpy1987844

    50728 Điểm

  3. vxh2k9850vxh2k9850

    35980 Điểm

  4. Nqoc_bakaNqoc_baka

    34614 Điểm

Phần thưởng hằng tháng
Hạng 1: 200.000 đồng
Hạng 2: 100.000 đồng
Hạng 3: 50.000 đồng
Hạng 4: 20.000 đồng
Phần thưởng bao gồm: mã giảm giá Shopee, Nhà Sách Phương Nam, thẻ cào cùng nhiều phần quà hấp dẫn khác sẽ dành cho những bạn tích cực nhất của tháng. Xem tại đây
Bảng xếp hạng cập nhật 30 phút một lần
...