RSS

VẤN ĐỀ LOCKING ĐỐI VỚI CURSOR

29 Jul
  1. 1.      Có 2 chế độ thực hiện việc khóa và nhả khóa đối với cursor
    Chế độ 1
    : Cursor locking
  • Cách thực hiện khóa và nhả khóa trong chế độ này được xác định thông qua câu lệnh set transaction isolation level hoặc select .. with (…lock).
  • Các thiết lập cũng như về isolation đối với cursor hoàn toàn giống với các câu lệnh select bình thường. Tức là khóa sẽ được giữ kể từ khi các dòng dữ liệu được lấy ra cho đến hết giao tác (nếu isolation level là repeatable read hoặc serializable) hoặc được nhả ra ngay sau khi đã lấy được các dòng dữ liệu (nếu isolation level là các mức còn lại).
  • Vấn đề cần quan tâm đối với cursor là thời điểm mà các dòng dữ liệu thực sự được lấy ra. Thời điểm này sẽ phụ thuộc vào loại cursor được khai báo trong câu lệnh Declare Cursor (xem thêm trong Book Online về câu lệnh này
  • Cú pháp câu lệnh Declare Cursor:

DECLARE cursor_name CURSOR[ LOCAL | GLOBAL ][ FORWARD_ONLY | SCROLL ][ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ][ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ][ TYPE_WARNING ]FOR select_statement[ FOR UPDATE [ OF column_name [ ,…n ] ] ]

  • Nếu loại cursor là static hay keyset thì các dữ liệu thỏa mãn câu lệnh select sẽ thực sự được lấy ra ngay khi ta gọi lệnh Open Cursor. Nghĩa là, ngay sau câu lệnh này thì các dòng dữ liệu bắt đầu bị khóa. Khóa có thể được nhả ngay hoặc được giữ đến cuối giao tác tùy theo isolation level.
  • Nếu loại cursor là Dynamic thì sau câu lệnh Open Cursor dữ liệu vẫn chưa được lấy ra nên vẫn chưa có dòng nào bị khóa. Dữ liệu chỉ được lấy ra sau từng câu lệnh Fetch. Do đó, sau mỗi câu lệnh Fetch, dòng dữ liệu được lấy ra sẽ bắt đầu được khóa. Như vậy, các dòng dữ liệu trong cursor sẽ được khóa 1 cách lần lượt. Việc nhả khóa cũng tương tự như trên.
  • Nếu loại cursor là Fast forward-only thì việc các dòng dữ liệu được lấy ra khi nào là do thành phần query optimizer của sql server quyết định.Do đó, ta không xác định được thời điểm các dòng dữ liệu bị khóa.
  1. Chế độ 2: Cursor concurrency
  • Cách thực hiện khóa và nhả khóa trong chế độ này được xác định thông qua các tùy chọn khi ta khai báo cursor
  • Cú pháp câu lệnh Declare Cursor:

DECLARE cursor_name CURSOR[ LOCAL | GLOBAL ][ FORWARD_ONLY | SCROLL ][ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ][ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ][ TYPE_WARNING ]FOR select_statement[ FOR UPDATE [ OF column_name [ ,…n ] ] ]

  • Nếu thiết lập tùy chọn SCROLL_LOCKS:

Các dòng dữ liệu sẽ lần lượt được khóa bằng update lock ngay sau khi được lấy ra bằng câu lệnh fetch. Thời điểm các dòng dữ liệu được nhả khóa sẽ phụ thuộc vào việc Cursor này có được thao tác bên trong 1 transaction hay không.

  • Nếu như Cursor không được thao tác bên trong 1 transaction thì các dòng dữ liệu sẽ được nhả khóa ngay sau khi dòng kế tiếp được fetch.
  • Nếu như Cursor được thao tác bên trong 1 transaction thì tất cả các dòng dữ liệu chỉ được nhả khóa sau khi kết thúc transaction (bất kể isolation level là gì).
  • Nếu thiết lập tùy chọn  READ_ONLY: Không có dòng dữ liệu nào bị khóa
  • Nếu thiết lập tùy chọn  OPTIMISTIC: Không có dòng dữ liệu nào được khóa. Có thể xem thêm về tác dụng tùy chọn này trong Book Online với từ khóa cursors [SQL Server], concurrency

LOCK ESCALATION

  • Khi 1 transaction yêu cầu đặt lock (shared lock hay exclusive lock) lên 1 số dòng dữ liệu thì sql server sẽ tự động đặt intent lock lên các page hay table chứa các dòng dữ liệu đó (có thể xem intent lock là 1 dạng lock tiềm tàng (potential) vì nó có khả năng nâng lên thành 1 lock bình thường như shared lock hay exclusive lock).
  • Khi số lượng lock bên trong 1 transaction vượt qua 1 nguỡng giới hạn (threshold) thì intent lock trên table sẽ được nâng lên (escalate) thành 1 lock ở cấp cao hơn (intent exclusive hay exclusive). Đồng thời, các lock trên các dòng, page sẽ được giải phóng.
  • Đối với SQL Server 6.x, người dùng có quyền thiết lập threshold.
  • Đối với SQL Server 2000, thông số threshold này được tự động thiết lập.
  • Đối với SQL Server 2005 vấn đề Lock Escalation là rất phức tạp
 
Leave a comment

Posted by on July 29, 2011 in Software

 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: