Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Oracle Locks &table lock:Cách thức hoạt động

Cơ sở dữ liệu Oracle là cơ sở dữ liệu được sử dụng rộng rãi trong ngành. Ở đây tôi đang cố gắng giải thích về khóa oracle, khóa bảng oracle

Mục lục

Oracle Enqueue là gì và các khóa

Enqueue là các khóa Oracle tuần tự hóa các hoạt động với cấu trúc được chia sẻ. Cấu trúc được chia sẻ có thể là bảng, làm lại các chuỗi và giao dịch.

Khi người dùng A cập nhật hàng 12 trong bảng, nó nhận được Giao dịch Enqueue (khóa). Điều này được thực hiện để Bất kỳ người dùng nào mà tôi đang cố gắng cập nhật cùng hàng 12 đó trong bảng sẽ đợi cho đến khi người dùng A thực hiện giao dịch. Vì vậy, bây giờ nếu người dùng B cố gắng cập nhật cùng một hàng, nó sẽ đợi trong hàng đợi.

Sau khi người dùng A thực hiện giao dịch, giao dịch của Người dùng B sẽ tiếp tục

Chúng tôi có địa chỉ gọi cục bộ trong cơ sở dữ liệu cá thể đơn lẻ trong khi với Oracle RAC, chúng ta có địa chỉ xếp hạng cục bộ và địa chỉ xếp hạng chung để quản lý tài nguyên được chia sẻ

Định danh Enqueue là gì

Hàng đợi được xác định duy nhất bằng cách sử dụng định dạng

Tài nguyên có thể

TM -> ổ khóa bàn

MR-> Khôi phục phương tiện

TX-> Giao dịch

Id1 và id2 là số khác nhau đối với các loại tài nguyên khác nhau

Giống như khóa bảng (TM), nó được viết là

TM- -0

Khi người dùng yêu cầu quyền truy cập vào tài nguyên ở một chế độ nhất định, mã định danh hàng đợi được tạo ra được giải thích ở trên

Hàng đợi được tổ chức ở chế độ này

SS:Chế độ chia sẻ hàng

SX:Chế độ dành riêng cho hàng

S:Khóa bảng ở chế độ chia sẻ

SSX:Khóa bảng ở chế độ chia sẻ và hàng ở chế độ độc quyền

X:Khóa bảng ở chế độ độc quyền

Tài nguyên Enqueue là gì

Mỗi enqueue được duy trì thông qua một cấu trúc tài nguyên bởi máy chủ Oracle và nó được xác định như đã giải thích ở trên. Cấu trúc tài nguyên có ba danh sách

  1. Danh sách chủ sở hữu
  2. Danh sách chờ
  3. Danh sách chuyển đổi

Khi người dùng yêu cầu khóa tài nguyên ở một chế độ nhất định, nó sẽ có được cấu trúc khóa và nó đưa ra yêu cầu để có được khóa trên tài nguyên nhất định. Nó được đặt trong danh sách cấu trúc tài nguyên này theo yêu cầu của khóa.

Vì vậy, trước tiên người dùng yêu cầu tài nguyên đó, sau đó nó sẽ được đưa vào danh sách chủ sở hữu

Cấu trúc tài nguyên được lấy từ bảng Tài nguyên và cấu trúc khóa lấy từ bảng Khóa. Cả hai đều được phân bổ trong SGA

Số lượng hàng trong bảng tài nguyên được xác định bởi tham số khởi tạo enqueue_resources. Các giá trị đang sử dụng có thể được nhìn thấy trong chế độ xem v $ resource

Số hàng trong bảng cấu trúc khóa được xác định bởi tham số khởi tạo _enqueue_locks. Các giá trị đang được sử dụng có thể được nhìn thấy trong v $ enqueue_lock

Việc tra cứu được thực hiện như thế nào trong bảng Tài nguyên?

  • Bảng tài nguyên chứa tất cả cấu trúc tài nguyên. Thuật toán băm được sử dụng để tìm và truy cập cấu trúc tài nguyên trong bảng tài nguyên.
  • Bảng tài nguyên được sắp xếp trong nhóm băm. Mỗi nhóm băm chứa một danh sách cấu trúc tài nguyên ở dạng danh sách được liên kết.
  • Khi tài nguyên được tìm kiếm, hàm băm của nó được lấy bằng cách sử dụng thuật toán băm và sau đó chốt thu được để tìm nhóm băm tương ứng và sau đó tài nguyên được tìm kiếm trên danh sách trong nhóm băm. Nếu tài nguyên được tìm thấy, cấu trúc Khóa sẽ được lấy và yêu cầu được đặt cho chủ sở hữu, người phục vụ và danh sách chuyển đổi theo mức độ khóa cụ thể được yêu cầu

Ví dụ TM-575-0 tài nguyên được băm thành nhóm 1, Một chuỗi băm chốt enqueue được lấy để truy cập nhóm băm và danh sách được truy cập trong nhóm để lấy cấu trúc tài nguyên

  • Nếu tài nguyên không được tìm thấy trong danh sách nhóm và cấu trúc tài nguyên mới được lấy từ danh sách tài nguyên miễn phí và được đặt trong danh sách nhóm. Điều này xảy ra dưới Enqueue chốt. Một cấu trúc khóa cũng được cấp phát

Yêu cầu khóa được đặt trong danh sách chủ sở hữu của cấu trúc tài nguyên

Hoạt động của enqueue hoạt động như thế nào?

Khi người dùng yêu cầu khóa tài nguyên, máy chủ Oracle thực hiện những việc sau

  • Nếu tài nguyên hiện không được sở hữu, tài nguyên sẽ được cấp cho người dùng
  • Nếu nó được sở hữu và có người phục vụ và người chuyển đổi, thì nó sẽ được đặt ở cuối hàng đợi của người phục vụ
  • Nếu nó được sở hữu nhưng không có người phục vụ và bộ chuyển đổi thì nếu nó tương thích với khóa của chủ sở hữu, yêu cầu được chấp nhận. Nếu nó không tương thích, nó sẽ được đưa vào danh sách bồi bàn
  • Một bộ chuyển đổi được phép tiếp tục nếu yêu cầu ít hạn chế hơn so với khóa hiện đang được giữ hoặc chế độ được yêu cầu tương thích với khóa do chủ sở hữu khác nắm giữ
  • Người phục vụ được phép tiếp tục nếu danh sách bộ chuyển đổi trống, không có người chờ phía trước và khóa được yêu cầu tương thích với khóa hiện có
  • Công cụ chuyển đổi luôn được xử lý trước những người phục vụ.
  • Máy chủ Oracle kiểm tra các hàng đợi này mỗi khi khóa được phát hành hoặc chuyển đổi.

Cách hàng đợi được kiểm tra khi khóa Oracle được phát hành hoặc chuyển đổi

  • Các quy trình chờ đợi tài nguyên ngủ trên các semaphores và các semaphores được sử dụng làm cơ chế ngủ / đánh thức. Sau khi xếp vào hàng đợi, quá trình yêu cầu sẽ chuyển sang trạng thái ngủ trên semaphore bằng cách sử dụng lệnh gọi sync_op.

sync_op (SYNC_WAIT, SYNCF_BINARY, 300) =1

  • Khi quá trình giữ tài nguyên đã sẵn sàng để giải phóng tài nguyên, nó sẽ xem xét hàng đợi được đính kèm với cấu trúc tài nguyên. Nếu có một quá trình trong hàng đợi, nó sẽ gửi tín hiệu semaphore đến quá trình chờ bằng cách sử dụng

cuộc gọi sync_op.

sync_op (0x0005, SYNCF_BINARY, 134491620) =1

  • Quá trình chờ sẽ xử lý tín hiệu và sẽ đánh thức. Quá trình chờ đợi này sửa đổi trạng thái theo các bước được đưa ra trong hoạt động xếp hàng

Các loại enqueue phổ biến

JQ - Hàng đợi Công việc. Khi một công việc (được gửi bởi DBMS_JOB.SUBMIT) đang chạy, nó được bảo vệ bởi một hàng đợi JQ (có nghĩa là chỉ một quy trình SNP có thể chạy công việc).

ST - Giao dịch quản lý không gian . Hàng đợi ST cần được tổ chức mỗi khi phiên đang phân bổ / giảm cấp phát phạm vi (có nghĩa là muốn thay đổi bảng từ điển UET $ và FET $), như liên kết, thả / cắt ngắn phân đoạn và phân loại đĩa. Nếu phiên bị hết thời gian chờ khi yêu cầu hàng đợi ST, thì "ORA-1575 hết thời gian chờ quản lý dung lượng" sẽ được trả về.

Danh sách TM - DML (Bảng). Mỗi khi một phiên muốn khóa một bảng, một hàng đợi TM được yêu cầu. Nếu một phiên xóa một hàng trong bảng mẹ (DEPT) và một ràng buộc tham chiếu (khóa ngoại) được tạo mà không có chỉ mục trên bảng con (EMP) hoặc nếu phiên đó đang cập nhật (các) cột mà ngoại tham chiếu chính đến sau đó khóa chia sẻ (cấp 4) được đưa vào bảng con. Nếu một phiên khác cố gắng thực hiện các thay đổi đối với bảng con, họ phải đợi (vì họ muốn xếp hàng ở chế độ dành riêng cho hàng và điều đó không tương thích với chế độ chia sẻ). Nếu một chỉ mục được tạo trên cột khóa ngoài của bảng con, thì không cần chia sẻ khóa trên bảng con.

TX - Giao dịch. Ngay sau khi một giao dịch được bắt đầu, cần có một hàng đợi TX. Một giao dịch được xác định duy nhất bởi số phân đoạn khôi phục, số vị trí trong bảng giao dịch của phân đoạn khôi phục và số thứ tự của số vị trí. Một phiên có thể đang chờ trên hàng đợi TX vì một số lý do:

1) Một phiên khác đang khóa hàng được yêu cầu.

2) Khi hai phiên cố gắng chèn cùng một khóa duy nhất vào một bảng (không phiên nào trong số họ thực hiện COMMIT), thì phiên cuối cùng đang đợi phiên đầu tiên COMMIT hoặc ROLLBACK.

3) Không có ITL miễn phí (Danh sách giao dịch quan tâm) trong tiêu đề khối (tăng INI_TRANS och PCT_FREE cho phân khúc).

UL - Khóa người dùng . Một phiên đã bị khóa với Hàm DBMS_LOCK.REQUEST.

Lượt xem và Bảng để xem Oracle enqueue và Oracle khóa

V $ session và v $ session_wait

Khi nào phiên đang chờ trong hàng đợi hoặc khóa, đây có thể là phiên từ phiên V $ (từ 11g trở lên) và v $ session_wait

 Chọn * từ v $ session_wait trong đó sự kiện như ‘enq%’; Tham số của sự kiện chờ trong hàng đợi có ý nghĩa sau:P1:loại tài nguyên và chế độ mong muốnP2:ID1 của tài nguyênP3:ID2 của tài nguyên 

Chúng tôi có thể sử dụng truy vấn dưới đây để lấy tất cả các hàng trong hệ thống

 Chọn sự kiện, p1, p2, p3 từ v $ session_wait trong đó wait_time =0 và sự kiện như 'enq%'; 
  1. V $ lock là một dạng xem hữu ích khác để kiểm tra hàng đợi
  2. V $ lock liệt kê tất cả cấu trúc khóa hiện đang được giữ trong hệ thống
  3. Loại cột, id1 và id2 đại diện cho loại tài nguyên, id1 và id2 của cấu trúc tài nguyên. Vì vậy, nó có thể được kết hợp với V $ resource chứa danh sách tất cả cấu trúc tài nguyên
  • LMODE và yêu cầu cho chúng tôi biết hàng đợi nào (chủ sở hữu, người chuyển đổi, người phục vụ) là phiên hoạt động
LMODE Yêu cầu Tên hàng đợi
> 0 =0 Chủ sở hữu
=0 > 0 Người phục vụ
> 0 > 0 Công cụ chuyển đổi

Truy vấn dưới đây có thể được sử dụng để tìm người giữ và người phục vụ

 SELECT inst_id, DECODE (request, 0, 'Holder:', 'Waiter:') || sid sess, id1, id2, lmode, request, typeFROM V $ LOCKWHERE (id1, id2, type) IN (SELECT id1 , id2, nhập FROM V $ LOCK WHERE request> 0) ORDER BY id1, request; 

Trong trường hợp RAC, truy vấn dưới đây có thể được sử dụng để tìm ra những kẻ chặn và người phục vụ

 SELECT inst_id, DECODE (request, 0, 'Holder:', 'Waiter:') || sid sess, id1, id2, lmode, request, typeFROM GV $ LOCKWHERE (id1, id2, type) IN (SELECT id1 , id2, nhập FROM gV $ LOCK WHERE request> 0) ORDER BY id1, request; 

V $ lock_object

nó là một dạng xem hữu ích khác cho các khóa bảng Oracle

Nó chứa tất cả các khóa TM trong cơ sở dữ liệu. Nó cung cấp cho vị trí giao dịch, quy trình hệ điều hành và id phiên của phiên đang giữ khóa TM

Có một số chế độ xem có thể được sử dụng để tìm thông tin về ổ khóa. Các chế độ xem này được tạo bởi catblock.sql

DBA_LOCKS Hiển thị tất cả các ổ khóa như v $ lock
DBA_DML_LOCKS Hiển thị tất cả các khóa DML ™ được giữ hoặc được yêu cầu
DBA_DDL_LOCKS Hiển thị tất cả các khóa DDL được giữ hoặc được yêu cầu
DBA_WAITERS Hiển thị tất cả các phiên đang chờ, nhưng không giữ các phiên đã chờ
DBA_BLOCKERS Hiển thị các phiên không chờ đợi đang chờ các phiên có khóa

Truy vấn để tìm ra phiên chờ và phiên giữ trong Oracle

 đặt kích thước dòng tiêu đề 1000 cột wait_session 'WAITING | SESSION' tiêu đề cột hold_session' HOLDING | SESSION' định dạng lock_type cột a15 định dạng cột mode_held a15 định dạng cột mode_requested a15selectwaiting_session, hold_session, lock_type, mode_held, mode_frequested / 
  Truy vấn để tìm ra tất cả các đối tượng bị khóa  

 đặt thuật ngữ trên; đặt dòng 130; cột sid_ser định dạng a12 tiêu đề 'session, | serial #'; định dạng tên người dùng cột a12 tiêu đề 'os user / | db user'; định dạng quy trình cột a9 tiêu đề 'os | process'; cột định dạng spid a7 tiêu đề 'theo dõi | số'; định dạng chủ_bộ cột a35 tiêu đề 'owner.object'; định dạng chế độ cột a13 tiêu đề 'bị khoá | chế độ'; định dạng trạng thái cột a8 tiêu đề 'status'; selectsubstr (to_char (l.session_id) | | ',' || to_char (s.serial #), 1,12) sid_ser, substr (l.os_user_name || '/' || l.oracle_username, 1,12) tên người dùng, l.process, p.spid, substr (o.owner || '.' || o.object_name, 1,35) owner_object, decode (l.locked_mode, 1, 'No Lock', 2, 'Row Share', 3, 'Row Exclusive', 4 , 'Share', 5, 'Share Row Excl', 6, 'Exclusive', null) lock_mode, substr (s.status, 1,8) statusfromv $ lock_object l, all_objects o, v $ session s, v $ process pwherel .object_id =o.object_idand l.session_id =s.sidand s.paddr =p.addrand s.status! ='KILLED' / 

Cách xử lý khóa DML trong máy chủ Oracle

Khi cập nhật, chèn, xóa hoặc chọn để cập nhật được thực thi trên bảng oracle, Oracle sẽ sử dụng hai khóa này

  • Khóa bảng DML:Để đảm bảo tính nhất quán của định nghĩa đối tượng trong suốt thời gian của giao dịch. Điều này ngăn không cho bất kỳ hoạt động DDL nào xảy ra khi đang xử lý DML.
  • Khóa Hàng DML:Điều này nhằm đảm bảo tính nhất quán của dữ liệu trong quá trình thực hiện giao dịch. Chúng ta có thể diễn đạt lại như Điều này có được một khóa trên hàng cụ thể đang được chạm vào và bất kỳ giao dịch nào khác cố gắng sửa đổi cùng một hàng sẽ bị chặn, cho đến khi giao dịch đã sở hữu nó kết thúc

Cách triển khai các khóa bảng Oracle

Chúng tôi đã giải thích cơ sở hạ tầng của Enqueue trong phần trước. Khóa bảng Oracle được triển khai dưới dạng TM Enqueue

Vì vậy, cấu trúc Enqueue sẽ là

TM- -0

Các chế độ là

RS:chia sẻ hàng

RX:hàng độc quyền

S:chia sẻ

SRX:chia sẻ hàng độc quyền

X:độc quyền

Mỗi con trỏ duy trì một danh sách cấu trúc khóa bảng được tạo trong khi phân tích cú pháp câu lệnh. Trong lần thực thi đầu tiên, lệnh gọi hàm được thực hiện để khóa tất cả bảng trong danh sách. Các khóa được giải phóng khi giao dịch được cam kết hoặc hoàn nguyên.

Khả năng khôi phục, đặc biệt là khôi phục về một điểm lưu, làm tăng thêm một khía cạnh phức tạp khác cho việc khóa từ điển. Cụ thể, nếu một giao dịch được khôi phục lại sau thời điểm mà khóa đã được nâng cấp, thì khóa phải được hạ cấp tương ứng, như một phần của hoạt động khôi phục, để giảm nguy cơ bế tắc giả tạo.

Các yêu cầu của khóa từ điển đối với các giao dịch và đặc biệt là duy trì lịch sử chuyển đổi khóa, được cung cấp bởi khóa DML kết hợp với TM enqueue. Mọi giao dịch giữ khóa DML cũng giữ một khóa đường dẫn TM. Chức năng khóa cơ bản được cung cấp bởi enqueue và khóa DML bổ sung thêm tính năng duy trì lịch sử chuyển đổi.

Mảng cố định của cấu trúc khóa DML được định cỡ bằng tham số DML_LOCKS. Danh sách miễn phí của nó được bảo vệ bằng chốt phân bổ khóa dml và các vị trí hoạt động hiển thị trong V $ LOCKED_OBJECT.

Để đặt các DML_LOCK, hãy kiểm tra việc sử dụng trong v $ resource_limit. Chúng tôi có thể đặt nó một cách rộng rãi vì nó chiếm rất ít dung lượng

Làm cách nào để tắt khóa bảng?

  • Các khóa DML và các khóa hàng đợi TM liên quan có thể bị vô hiệu hóa, hoàn toàn hoặc chỉ đối với một số bảng nhất định.
  • Để tắt hoàn toàn các khóa này, thông số DML_LOCKS phải được đặt thành 0. Trong cơ sở dữ liệu máy chủ song song, nó phải được đặt thành 0 trong tất cả các trường hợp.
  • Để vô hiệu hóa các khóa như vậy đối với một bảng cụ thể, bạn phải sử dụng mệnh đề KHÓA BẢNG HẠN CHẾ của câu lệnh ALTER TABLE.
  • Nếu khóa bị tắt đối với một bảng, thì các câu lệnh DML vẫn có thể sửa đổi các khối của bảng và khóa cấp hàng vẫn được giữ. Tuy nhiên, các khóa bảng chế độ chia sẻ phụ thường được kết hợp với các truy vấn và các khóa bảng chế độ chia sẻ phụ thường được liên kết với DML, không được sử dụng. Thay vào đó, các giao dịch chống lại bảng được bảo vệ khỏi DDL xung đột bằng cách chỉ cấm mọi nỗ lực thực hiện khóa trên toàn bộ bảng và do đó tất cả DDL chống lại bảng.
  • Tắt khóa bảng có thể tăng hiệu suất vì giảm chi phí chuyển đổi khóa. Điều này đặc biệt quan trọng hơn trong trường hợp RAC, nơi chi phí này khá cao.
  • Việc vô hiệu hoá các khoá bảng cũng ngăn cản việc tạo các chỉ mục khoá ngoại. Vì khóa ngoại cần được lập chỉ mục để tránh khóa bảng của bảng con trong khi các hàng được thao tác trong bảng mẹ. Vì vậy, nếu chúng ta vô hiệu hóa tất cả khóa bảng cùng nhau thì không cần lập chỉ mục
  • Tốt hơn nên sử dụng bảng thay đổi để tắt khóa bảng trên một số bảng sau đó đặt thành bảng dml_locks. Như thể dml_locks được đặt thành 0, chúng tôi sẽ cần trả lại phiên bản để đặt lại nó
  • Trong chèn tải trực tiếp, một phiên sẽ sử dụng hàng đợi TM ở chế độ ‘X’. Điều này ngăn không cho bất kỳ DML nào khác diễn ra trong khi tải trực tiếp đang diễn ra, ngoài việc chặn tất cả DDL

Cách khóa hàng DML được triển khai

Khóa hàng DML được triển khai dưới dạng kết hợp của hai điều sau đây

  1. Khóa mức hàng:Nó được triển khai dưới dạng byte khóa trong mỗi tiêu đề hàng và ITL (danh sách giao dịch quan tâm) trong mỗi khối dữ liệu hoặc chỉ mục. Chúng không được lưu vào bộ nhớ đệm ở bất kỳ đâu và vì chúng được lưu trữ trong chính khối không phải trong SGA bị giới hạn, cơ chế Khóa bằng oracle này có khả năng mở rộng rất lớn
  2. Khóa giao dịch:Những khóa này được triển khai dưới dạng TX Enqueue

Byte khóa trỏ đến mục nhập ITL trong khối và Tất cả các mục nhập ITL cho các điểm giao dịch tới TX Enqueue, cuối cùng sẽ xác định xem giao dịch được cam kết hay khôi phục. Nhân viên phục vụ sẽ đợi khi khóa giao dịch

Ví dụ

  • Một giao dịch A muốn cập nhật hàng 2 và 3 trong khối. Nó sẽ phân bổ một ITL (danh sách giao dịch quan tâm). Giao dịch truy cập vào hàng 2 và 3 và thấy byte khóa. Nếu byte khóa bằng 0, nó không bị khóa. Giao dịch sẽ cập nhật hàng 3, 3
  • Bây giờ một giao dịch B bắt đầu và nó muốn cập nhật các hàng 1. Nó sẽ phân bổ một ITL (danh sách giao dịch quan tâm). Giao dịch truy cập vào hàng 1 và thấy byte khóa. Nếu byte khóa bằng 0, nó không bị khóa. Giao dịch sẽ cập nhật hàng 1
  • Bây giờ giao dịch muốn cập nhật hàng 2. Nó sẽ truy cập hàng và sẽ thấy nó bị khóa vì byte khóa sẽ không bằng 0. Nó sẽ tìm trong ITL giữ khóa. Nó sẽ thực hiện ITL cleannout để tìm hiểu xem giao dịch đang hoạt động hay không hoạt động. Trong trường hợp này, nó sẽ tìm thấy Giao dịch A đang hoạt động. Vì vậy, giao dịch B phải đợi giao dịch A quay trở lại hoặc cam kết. Giao dịch B sẽ đợi khi yêu cầu TX Enqueue mà giao dịch A giữ ở chế độ độc quyền

Danh sách giao dịch quan tâm (ITL) là gì

Khi một phiên muốn sửa đổi một khối, nó phải cấp phát một ITL trong khối. ITL là cấu trúc dữ liệu trong tiêu đề khối chứa nhiều vị trí được thực hiện bởi giao dịch. Nó được xác định bởi tham số INITRANS và MAXTRANS khi bảng được tạo. Số lượng vị trí ban đầu được tạo theo INITTRANS và chúng tự động tăng lên đến tối đa MAXTRANS

Giao dịch là gì?

Khi một phiên cập nhật / xóa / chèn, thì một giao dịch sẽ được bắt đầu. Nó được hoàn thành khi cam kết hoặc khôi phục xảy ra. Một giao dịch được xác định bằng số nhận dạng giao dịch (XID). Giao dịch xác định bao gồm ba phần

  1. Khôi phục hoặc hoàn tác số phân đoạn
  2. Số vị trí của bàn giao dịch
  3. Trình tự hoặc không kết thúc

XID =usn # .slot # .wrap #

Mỗi ITL khối sẽ chứa XID

Xóa sạch ITL có nghĩa là tìm kiếm XID trong ITL và tìm kiếm các phân đoạn khôi phục dựa trên điều này và tìm kiếm bảng giao dịch và số gói để kiểm tra tính hoạt động của giao dịch.

Chúng ta có thể sử dụng lệnh dưới đây để kết xuất bất kỳ phân đoạn khôi phục nào

Tiêu đề hoàn tác kết xuất hệ thống thay thế ;

Mỗi giao dịch đang hoạt động có thể được nhìn thấy trong bảng giao dịch v $

 select addr, xidusn, xidslot, xidsqnfrom v $ transaction; ADDR XIDUSN XIDSLOT XIDSQN ------------- ---------------- ------- 3C485875 50 5 3000 

Mã định danh giao dịch (XID) cũng có thể được lấy trong phiên riêng bằng cách sử dụng

 chọn dbms_transaction.local_transaction_id từ dual; 

Sự chờ đợi trên enq TX sẽ được chứng kiến ​​trong v $ session_wait

P1:Tên | chế độ

P2:rbs3 | wrap #

P3:vị trí #

Để tóm tắt các khóa hàng DML

DML đầu tiên trong một phiên mà giao dịch chưa tồn tại sẽ mặc nhiên tạo giao dịch.

  • Số hoàn tác phân đoạn, vị trí và gói sẽ được chỉ định
  • Hàng đợi TX sẽ được khởi tạo

Khi một hàng cần sửa đổi được xác định, phiên sẽ có một mục nhập trong ITL của khối dữ liệu, gán nó cho giao dịch

  • USN / SLOT / WRAP sẽ được ghi vào vùng ITL, dành vùng đó cho giao dịch hiện tại
  • Khóa sẽ được thực hiện trên hàng, bằng cách đặt byte khóa trong thư mục hàng để trỏ đến vị trí ITL của giao dịch hiện tại

Cả TM và TX Enqueue đều có thể được nhìn thấy trong V $ lock

  • Loại xác định TM hoặc TX
  • ID1 và ID2 có thể mang thông tin bổ sung, nhưng phân biệt ngữ cảnh đối với LOẠI hàng đợi
  • Đối với hàng đợi TM, ID1 là OBJECT_ID của đối tượng đang bị khóa, có thể được tham chiếu trong DBA_OBJECTS và ID2 luôn là 0
  • Đối với TX Enqueue, ID1 và ID2 giữ số hoàn tác phân đoạn, số vị trí và bọc

Ví dụ chi tiết để giải thích khóa oracle hoạt động

  • Tạo bảng giả
 Tạo bảng từ j dưới dạng select * từ dba_objects trong đó rownum <3; Bảng được tạo Tạo bảng từ j1 dưới dạng select * từ dba_objects trong đó rownum <3; Bảng được tạo 
  • Phiên A
 Chọn * từ j để cập nhật; 

Hãy xem những gì có trong v $ lock

 SQL> chọn sid riêng biệt từ v $ mystat; SID ---------- 2125SQL> select * from v $ lock where sid =2125; ADDR KADDR SID TY ID1 ID2 LMODE ---------------- ------------- ---------- - ---------- ---------- ----- ----- YÊU CẦU KHỐI CTIME ---------- ---------- ---------- 00000006B5D9D0D0 00000006B5D9D148 2125 TX 2883613 16425600 60 44 0FFFFFFFF7DA4B360 FFFFFFFF7DA4B3C0 2125 TM 21488781 0 30 44 0 

Vì vậy, chúng tôi thấy ở đây

Khóa bảng DML Oracle được tạo

TX (khóa giao dịch) được tạo

  • Hãy bắt đầu phiên B
 SQL> Chọn * từ j1 để cập nhật; SQL> chọn sid riêng biệt từ v $ mystat; SID ---------- 2302SQL> select * from v $ lock where sid =2302; ADDR KADDR SID TY ID1 ID2 LMODE ---------------- ------------- ---------- - ---------- ---------- ----- ----- YÊU CẦU KHỐI CTIME ---------- ---------- ---------- 00000006AF7FF910 00000006AF7FF988 2302 TX 2949148 16884039 60 10 0FFFFFFFF7DA4B360 FFFFFFFF7DA4B3C0 2302 TM 33544 0 30 10 000000006DC289D60 00000006DC289DB8 2302 AE 15062272 0 40 106 0 

Vì vậy, chúng tôi thấy ở đây

Khóa bảng DML được tạo

TX (khóa giao dịch) được tạo

Bây giờ chúng ta hãy thử làm

 Chọn * từ j để cập nhật; 

Điều này sẽ bị treo

  • Hãy bắt đầu một phiên khác để phân tích vấn đề

Nếu bạn thấy thông tin chi tiết về phiên sid =2032 trong V $ lock

 select * from v $ lock where sid =2302; ADDR KADDR SID TY ID1 ID2 LMODE --------------------------------- --- ---------- - ---------- ---------- ---------- KHỐI CTIME YÊU CẦU-- -------- ---------- ---------- FFFFFFFF7DA4B360 FFFFFFFF7DA4B3C0 2302 TM 33544 0 30 47 000000006DC289D60 00000006DC289DB8 2302 AE 15062272 0 40 143 0  00000006DC289808 00000006DC289860 2302 TX 2883613 16425600 0   6 7 0  FFFFFFFF7DA4B360 FFFFFFFF7DA4B3C0 2302 TM 21488781 0 30 7 0 

Hàng in đậm là yêu cầu 6 (khóa riêng) trên một số phương thức TX

Bây giờ chúng ta có thể sử dụng truy vấn bên dưới để tìm phiên chặn

 select l1.sid, 'IS BLOCKING', l2.sidfrom v $ lock l1, v $ lock l2where l1.block =1 and l2.request> 0and l1.id1 =l2.id1and l1.id2 =l2.id2SID SID 'ISBLOCKING' ------------- ---------------- 2125 ĐANG CHẶN 2302 

Bây giờ chúng ta có thể cam kết hoặc quay lại phiên 2125 để giao dịch B tiếp tục. Chúng ta có thể kết thúc phiên 2125 bằng cách sử dụng lệnh bên dưới cũng để giải phóng khóa

 Phiên hủy hệ thống thay thế ‘2125, ’; 

Một số thông tin bổ sung khác

TX khóa trong v $ lock không cho biết thông tin hàng nơi có sự tranh chấp. Chúng ta có thể xem những điều đó bằng cách sử dụng các truy vấn

Truy vấn dưới đây cần được thực hiện từ phiên đang chờ

 SQL> select row_wait_obj #, row_wait_file #, row_wait_block #, row_wait_row # từ v $ session trong đó sid =2302ROW_WAIT_OBJ # ROW_WAIT_FILE # ROW_WAIT_BLOCK # ROW_WAIT_ROW # ------------- --------- --------------- ------------- 21488781 461 81063 0 chọn do.object_name, row_wait_obj #, row_wait_file #, row_wait_block #, row_wait_row #, dbms_rowid.rowid_create (1, ROW_WAIT_OBJ #, ROW_WAIT_FILE #, ROW_WAIT_BLOCK #, ROW_WAIT_ROW #) từ v $ phiên # s, dba_ob_jects =s.OBJJECT_S ở đâu.OBJ =230 OBJECT_NAME ROW_WAIT_OBJ # ROW_WAIT_FILE # ROW_WAIT_BLOCK # ROW_WAIT_ROW # DBMS_ROWID.ROWID_C ------------- ---- ------------- ------------------ J21488781 461 81063 0 ABR + SNAHNAAATynAAA SQL> Chọn * từ j trong đó rowid ='ABR + SNAHNAAATynAAA'; 

Các bài viết có liên quan

Cách khóa Oracle hoạt động
Cách tìm chi tiết phiên trong cơ sở dữ liệu Oracle
Kiểm tra tình trạng cơ sở dữ liệu quan trọng
Câu hỏi phỏng vấn dba ứng dụng oracle
Truy vấn kiểm tra khóa trong cơ sở dữ liệu oracle
oracle dba câu hỏi phỏng vấn

Các khóa học được đề xuất

Sau đây là một số khóa học được đề xuất mà bạn có thể mua nếu muốn tiến thêm một bước

Dưới đây là các liên kết đến một số khóa học


Oracle DBA 11g / 12c - Quản trị cơ sở dữ liệu cho Junior DBA :Khóa học này phù hợp với những người mới bắt đầu làm DBA Junior hoặc muốn trở thành Oracle DBA. Điều này sẽ giúp bạn hiểu rõ về các nhiệm vụ sao lưu &phục hồi và quản trị chung
Cơ sở dữ liệu Oracle:Quản trị Oracle 12C R2 RAC :Khóa học này bao gồm cài đặt, quản trị Oracle RAC. Một khóa học tốt cho Oracle DBA muốn nâng cấp kỹ năng của mình cho Oracle RAC
Oracle Data Guard:Quản trị cơ sở dữ liệu cho Oracle 12C R2 :Khóa học này bao gồm cài đặt, quản trị Oracle Dataguard. Một khóa học tốt cho Oracle DBA, những người muốn nâng cấp kỹ năng của mình cho Oracle Dataguard


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tải dữ liệu từ tệp văn bản vào bảng trong oracle

  2. hàm listunagg?

  3. Hàm so với thủ tục trong Oracle

  4. Các giá trị được phân tách bằng dấu phẩy trong Oracle

  5. Không thể truyền kết nối tới oracle.jdbc.OracleConnection