2010-08-06 27 views
6

Tôi hiểu một chút về chặn Oracle - cách cập nhật chặn các cập nhật khác cho đến khi giao dịch hoàn tất, cách nhà văn không chặn độc giả, v.v.Mối quan hệ giữa chặn, khóa và mức cách ly là gì?

Tôi hiểu khái niệm về khóa bi quan và tối ưu hóa mất thông tin cập nhật, v.v.

Tôi cũng hiểu các mức cách ly giao dịch JDBC mà chúng tôi có thể nói, ví dụ, chúng tôi rất vui khi thấy dữ liệu không được cam kết.

Tuy nhiên, tôi hơi mờ về cách các khái niệm này có liên quan và tương tác. Ví dụ:

  • Liệu Oracle cung cấp bi quan hoặc khóa lạc theo mặc định (nó chỉ dường như để ngăn chặn việc riêng biệt cập nhật dựa trên các thí nghiệm trong hai phiên cóc.)
  • Nếu, như tôi nghi ngờ, những là khái niệm cấp ứng dụng, tại sao Tôi gặp sự cố khi triển khai chiến lược khóa khi tôi có thể để cơ sở dữ liệu đồng bộ hóa giao dịch vẫn chưa cập nhật?
  • Mức độ cách ly giao dịch (mà tôi đặt trên kết nối) thay đổi hành vi của cơ sở dữ liệu như thế nào khi các ứng dụng khác ngoài ứng dụng của tôi truy cập với các mức cách ly khác nhau.

Bất kỳ từ nào để làm rõ các chủ đề này sẽ thực sự được đánh giá cao!

+0

Một số câu hỏi của bạn (ảnh hưởng tiêu cực giữa các khách hàng khác nhau nói riêng) có thể được trả lời tại đây: http://en.wikipedia.org/wiki/Isolation_%28database_systems%29 –

Trả lời

3
  • Oracle cho phép một trong hai loại khóa - cách bạn xây dựng ứng dụng của bạn ra lệnh cho những gì được sử dụng. Nhìn lại, nó không thực sự là một quyết định cơ sở dữ liệu.

  • Chủ yếu, khóa của Oracle đủ trong kết nối trạng thái tới cơ sở dữ liệu. Trong các ứng dụng không có trạng thái, ví dụ: ứng dụng web, bạn không thể sử dụng ứng dụng đó. Bạn phải sử dụng khóa cấp ứng dụng trong các tình huống như vậy vì khóa áp dụng cho một phiên.

  • Thông thường bạn không cần phải lo lắng về điều đó. Trong Oracle, người đọc không bao giờ chặn người viết và người viết không bao giờ chặn người đọc. Hành vi của Oracle không thay đổi với các mức cô lập ANSI khác nhau. Ví dụ, không có điều gì như là một "đọc bẩn" trong Oracle. Tom Kyte chỉ ra rằng tinh thần cho phép đọc sách dơ bẩn là tránh chặn các lần đọc, đó không phải là vấn đề trong Oracle.

Tôi khuyên bạn nên đọc cuốn sách tuyệt vời của Tom Kyte "Kiến trúc cơ sở dữ liệu Oracle chuyên gia", trong đó các chủ đề này và các chủ đề khác được giải quyết khá rõ ràng.

+0

Oracle có một số mức cách ly khác nhau với các hành vi khác nhau . Ví dụ: serilizable có thể dẫn đến lỗi "không thể serilize giao dịch" tại thời điểm commit, mà sẽ không được nhìn thấy ở mức cô lập bình thường. –

+0

Đây là ngoại lệ duy nhất mà tôi biết và không được sử dụng phổ biến. Nếu bạn cần sử dụng nó, thì bạn cần phải nhận thức được điều này.Việc triển khai nhiều phiên bản của Oracle đảm nhiệm các mức cô lập ANSI khác. – DCookie

2

Khóa lạc quan về cơ bản là "Tôi sẽ chỉ khóa dữ liệu khi tôi sửa đổi dữ liệu, chứ không phải khi tôi đọc dữ liệu". Bí quyết là nếu bạn không khóa dữ liệu ngay lập tức, người khác có thể thay đổi nó trước khi bạn làm và bạn đang xem tin tức cũ (và có thể ghi đè một cách mù quáng những thay đổi đã xảy ra giữa khi bạn đọc dữ liệu và cập nhật dữ liệu đó.)

Khóa bi quan là khóa dữ liệu khi bạn đọc nó để bạn chắc chắn rằng không ai thay đổi nó nếu bạn quyết định cập nhật nó.

Đây là một quyết định ứng dụng, không phải là một quyết định Oracle như:

CHỌN x, y, z từ table1 nơi a = 2

sẽ không khóa các hồ sơ phù hợp nhưng

CHỌN x, y, z FROM table1 WHERE a = 2 FOR UPDATE

sẽ. Vì vậy, bạn phải quyết định nếu bạn là ok với lạc khóa

SELECT x, y, z FROM table1 WHERE a = 2 

... thời gian trôi qua ...

UPDATE table1 
    SET x = 1, y = 2, z = 3 
WHERE a = 2 

(bạn có thể ghi đè lên một sự thay đổi người khác làm trong khi chờ đợi)

hoặc cần phải bi quan:

SELECT x, y, z FROM table1 WHERE a = 2 FOR UPDATE 

... thời gian trôi qua ...

UPDATE table1 
    SET x = 1, y = 2, z = 3 
WHERE a = 2 

(bạn chắc chắn rằng không có ai đã làm thay đổi dữ liệu kể từ khi bạn truy vấn nó.)

Kiểm tra ở đây cho các mức độ cô lập có sẵn trong Oracle. http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/consist.htm#CNCPT621

1

Oracle LUÔN xử lý khóa bi quan. Nghĩa là, nó sẽ khóa một bản ghi khi nó được cập nhật (và bạn cũng có thể nhấn khóa để xóa và chèn nếu có một khóa liên quan). Bạn có thể sử dụng SELECT .... FOR UPDATE để tăng thêm chiến lược khóa bi quan.

Thực sự bất kỳ cơ sở dữ liệu/công cụ lưu trữ nào hoạt động giao dịch phải thực hiện một số hình thức khóa.

Mức cô lập SERIALIZABLE gần hơn với cơ chế khóa lạc quan. Nó sẽ ném một ngoại lệ nếu giao dịch cố gắng cập nhật một bản ghi đã được cập nhật kể từ khi bắt đầu giao dịch. Tuy nhiên, nó dựa trên một-một giữa phiên cơ sở dữ liệu và phiên người dùng cuối.

Khi các ứng dụng kết nối/không có trạng thái trở nên phổ biến, đặc biệt là trong các hệ thống có hoạt động người dùng nặng, có phiên cơ sở dữ liệu được gắn trong một thời gian dài. Khóa tối ưu được ưu tiên và các phiên bản sau của Oracle hỗ trợ điều này với các mục ORA_ROWSCN và ROWDEPENDENCIES. Về cơ bản họ làm cho nó dễ dàng hơn để xem nếu một bản ghi đã được thay đổi kể từ khi bạn ban đầu/cuối cùng nhìn vào nó.

Vì mối quan hệ một-một giữa phiên cơ sở dữ liệu và phiên người dùng đã trở thành kế thừa, lớp ứng dụng đã duy trì trạng thái 'phiên người dùng' nhiều hơn và do đó trở nên có trách nhiệm hơn trong việc kiểm tra lựa chọn đó thực hiện năm/mười phút trước vẫn còn hiệu lực (ví dụ như cuốn sách vẫn còn trong kho, hoặc đã làm người khác mua nó).

Các vấn đề liên quan