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

Khái niệm chính về khóa SQL Server

Trong bài đăng này, chúng tôi sẽ thảo luận về cơ chế khóa SQL Server và cách giám sát việc khóa SQL Server với các chế độ xem quản lý động tiêu chuẩn của SQL Server. Trước khi chúng tôi bắt đầu giải thích kiến ​​trúc khóa của SQL Server, hãy dành một chút thời gian để mô tả cơ sở dữ liệu ACID (Tính nguyên tử, Tính nhất quán, Tính cách ly và Độ bền) là gì. Cơ sở dữ liệu ACID có thể được giải thích là lý thuyết cơ sở dữ liệu. Nếu một cơ sở dữ liệu được gọi là cơ sở dữ liệu quan hệ, thì nó phải đáp ứng các yêu cầu về Tính nguyên tử, Tính nhất quán, Tính cô lập và Độ bền. Bây giờ, chúng tôi sẽ giải thích các yêu cầu này một cách ngắn gọn.

Tính nguyên tử :Nó phản ánh nguyên tắc bất khả phân mà chúng tôi mô tả là đặc điểm chính của quy trình giao dịch. Không thể bỏ mặc một khối giao dịch. Một nửa khối giao dịch còn lại gây ra sự không nhất quán về dữ liệu. Toàn bộ giao dịch được thực hiện hoặc giao dịch trở lại ban đầu. Có nghĩa là, tất cả các thay đổi được thực hiện bởi giao dịch sẽ được hoàn tác và trở về trạng thái trước đó của chúng.

Nhất quán :Có một quy tắc đặt cấu trúc con của quy tắc không chia hết. Dữ liệu giao dịch phải cung cấp tính nhất quán. Nghĩa là, nếu thao tác cập nhật được thực hiện trong một giao dịch, thì tất cả các giao dịch còn lại phải được thực hiện hoặc thao tác cập nhật phải bị hủy. Dữ liệu này rất quan trọng về tính nhất quán.

Cô lập :Đây là một gói yêu cầu cho mỗi cơ sở dữ liệu giao dịch. Các thay đổi được thực hiện bởi một gói yêu cầu phải được hiển thị cho một giao dịch khác trước khi nó hoàn tất. Mỗi giao dịch phải được xử lý riêng biệt. Tất cả các giao dịch phải được hiển thị cho một giao dịch khác sau khi chúng xảy ra.

Độ bền: Giao dịch có thể thực hiện các hoạt động phức tạp với dữ liệu. Để bảo mật tất cả các giao dịch này, chúng phải có khả năng chống lại lỗi giao dịch. Các sự cố hệ thống có thể xảy ra trong SQL Server nên được chuẩn bị sẵn sàng và có khả năng phục hồi chống lại sự cố mất điện, hệ điều hành hoặc các lỗi khác do phần mềm gây ra.

Giao dịch: Giao dịch là ngăn xếp nhỏ nhất của quy trình mà không thể chia thành các phần nhỏ hơn. Ngoài ra, một số nhóm quy trình giao dịch có thể được thực hiện tuần tự nhưng như chúng tôi đã giải thích trong nguyên tắc Nguyên tử nếu ngay cả một trong các giao dịch không thành công, tất cả các khối giao dịch sẽ thất bại.

Khóa: Khóa là một cơ chế để đảm bảo tính nhất quán của dữ liệu. SQL Server khóa các đối tượng khi giao dịch bắt đầu. Khi giao dịch hoàn tất, SQL Server giải phóng đối tượng bị khóa. Chế độ khóa này có thể được thay đổi theo loại quy trình SQL Server và mức độ cách ly. Các chế độ khóa này là:

Khóa phân cấp: SQL Server có một hệ thống phân cấp khóa thu được các đối tượng khóa trong hệ thống phân cấp này. Cơ sở dữ liệu nằm ở đầu cấu trúc phân cấp và hàng nằm ở dưới cùng. Hình ảnh dưới đây minh họa phân cấp khóa của SQL Server.

Khóa (S) được chia sẻ: Loại khóa này xảy ra khi đối tượng cần được đọc. Loại khóa này không gây ra nhiều vấn đề.

Ổ khóa độc quyền (X): Khi loại khóa này xảy ra, nó xảy ra để ngăn các giao dịch khác sửa đổi hoặc truy cập vào một đối tượng bị khóa.

Cập nhật (U) Khóa: Loại khóa này tương tự như khóa độc quyền nhưng nó có một số điểm khác biệt. Chúng ta có thể chia hoạt động cập nhật thành các giai đoạn khác nhau:giai đoạn đọc và giai đoạn ghi. Trong giai đoạn đọc, SQL Server không muốn các giao dịch khác có quyền truy cập vào đối tượng này bị thay đổi. Vì lý do này, SQL Server sử dụng khóa cập nhật.

Khóa ý định: Khóa mục đích xảy ra khi SQL Server muốn có được khóa chia sẻ (S) hoặc khóa độc quyền (X) trên một số tài nguyên thấp hơn trong phân cấp khóa. Trong thực tế, khi SQL Server có được một khóa trên một trang hoặc một hàng, thì khóa mục đích là bắt buộc trong bảng.

Sau tất cả những lời giải thích ngắn gọn này, chúng tôi sẽ cố gắng tìm ra câu trả lời cho cách xác định ổ khóa. SQL Server cung cấp rất nhiều chế độ xem quản lý động để truy cập các số liệu. Để xác định khóa máy chủ SQL, chúng tôi có thể sử dụng sys.dm_tran_locks lượt xem. Ở chế độ xem này, chúng tôi có thể tìm thấy nhiều thông tin về tài nguyên trình quản lý khóa hiện đang hoạt động.

Trong ví dụ đầu tiên, chúng tôi sẽ tạo một bảng demo không bao gồm bất kỳ chỉ mục nào và cố gắng cập nhật bảng demo này.

CREATE TABLE TestBlock
(Id INT ,
Nm VARCHAR(100))

INSERT INTO TestBlock
values(1,'CodingSight')
In this step, we will create an open transaction and analyze the locked resources.
BEGIN TRAN
UPDATE TestBlock SET   Nm='NewValue_CodingSight' where Id=1
select @@SPID

Bây giờ, chúng ta sẽ kiểm tra chế độ xem sys.dm_tran_lock.

select * from sys.dm_tran_locks  WHERE request_session_id=74

Chế độ xem này trả về nhiều thông tin về tài nguyên khóa đang hoạt động. Nhưng không thể hiểu một số dữ liệu trong quan điểm này. Vì lý do này, chúng tôi phải tham gia sys.dm_tran_locks xem các chế độ xem khác.

SELECT dm_tran_locks.request_session_id,
       dm_tran_locks.resource_database_id,
       DB_NAME(dm_tran_locks.resource_database_id) AS dbname,
       CASE
           WHEN resource_type = 'OBJECT'
               THEN OBJECT_NAME(dm_tran_locks.resource_associated_entity_id)
           ELSE OBJECT_NAME(partitions.OBJECT_ID)
       END AS ObjectName,
       partitions.index_id,
       indexes.name AS index_name,
       dm_tran_locks.resource_type,
       dm_tran_locks.resource_description,
       dm_tran_locks.resource_associated_entity_id,
       dm_tran_locks.request_mode,
       dm_tran_locks.request_status
FROM sys.dm_tran_locks
LEFT JOIN sys.partitions ON partitions.hobt_id = dm_tran_locks.resource_associated_entity_id
LEFT JOIN sys.indexes ON indexes.OBJECT_ID = partitions.OBJECT_ID AND indexes.index_id = partitions.index_id
WHERE resource_associated_entity_id > 0
  AND resource_database_id = DB_ID()
 and request_session_id=74
ORDER BY request_session_id, resource_associated_entity_id

Trong hình trên, bạn có thể thấy các tài nguyên bị khóa. SQL Server có được khóa độc quyền trong hàng đó. ( RID :Giá trị nhận dạng hàng được sử dụng để khóa một hàng trong một đống) Đồng thời, SQL Server có được ý định khóa độc quyền trong trang và TestBlock bàn. Nó có nghĩa là bất kỳ quá trình nào khác không thể đọc tài nguyên này cho đến khi Máy chủ SQL phát hành khóa. Đây là cơ chế khóa cơ bản trong SQL Server.

Bây giờ, chúng tôi sẽ điền một số dữ liệu tổng hợp trên bảng thử nghiệm của mình.

TRUNCATE TABLE 	  TestBlock
DECLARE @K AS INT=0
WHILE @K <8000
BEGIN
INSERT TestBlock VALUES(@K, CAST(@K AS varchar(10)) + ' Value' )
SET @[email protected]+1
 END
After completing this step, we will run two queries and check the sys.dm_tran_locks view.
BEGIN TRAN
 UPDATE TestBlock  set Nm ='New_Value' where Id<5000

Trong truy vấn trên, SQL Server có được khóa độc quyền trên mỗi hàng. Bây giờ, chúng ta sẽ chạy một truy vấn khác.

BEGIN TRAN
 UPDATE TestBlock  set Nm ='New_Value' where Id<7000

Trong truy vấn trên, SQL Server tạo khóa độc quyền trên bảng, Bởi vì SQL Server cố gắng lấy nhiều khóa RID cho các hàng này sẽ được cập nhật. Trường hợp này gây tiêu tốn nhiều tài nguyên trong cơ sở dữ liệu. Do đó, SQL Server tự động di chuyển khóa độc quyền này đến một đối tượng cấp cao hơn nằm trong phân cấp khóa. Chúng tôi định nghĩa cơ chế này là Lock Escalation. Khóa Escalation có thể được thay đổi ở cấp bảng.

ALTER TABLE XX_TableName
SET
(
	LOCK_ESCALATION = AUTO -- or TABLE or DISABLE
)
GO

Tôi muốn thêm một số lưu ý về việc chuyển khóa. Nếu bạn có một bảng được phân vùng, thì chúng tôi có thể đặt mức tăng lên mức phân vùng.

Trong bước này, chúng tôi sẽ thực hiện một truy vấn tạo khóa trong bảng AdventureWorks HumanResources. Bảng này có các chỉ mục được phân nhóm và không theo nhóm.

BEGIN TRAN	
UPDATE 	  [HumanResources].[Department] SET Name='NewName' where DepartmentID=1

Như bạn có thể thấy trong ngăn kết quả bên dưới, giao dịch của chúng tôi có được các khóa độc quyền trong khóa chỉ mục của cụm PK_Department_DepartmentID và cũng có được khóa độc quyền trong khóa chỉ mục không nhóm của AK_Department_Name. Bây giờ, chúng ta có thể đặt câu hỏi này “Tại sao SQL Server khóa một chỉ mục không phân cụm?”

Tên được lập chỉ mục trong chỉ mục không phân cụm AK_Department_Name và chúng tôi cố gắng thay đổi Tên cột. Trong trường hợp này, SQL Server cần thay đổi bất kỳ chỉ mục không phân cụm nào trên cột đó. Cấp lá chỉ mục không phân cụm bao gồm mọi giá trị KEY được sắp xếp.

Kết luận

Trong bài viết này, chúng tôi đã đề cập đến các dòng chính của cơ chế khóa SQL Server và xem xét việc sử dụng sys.dm_tran_locks. Chế độ xem sys.dm_tran_locks trả về nhiều thông tin về các tài nguyên khóa hiện đang hoạt động. Nếu bạn google, bạn có thể tìm thấy rất nhiều câu hỏi mẫu về chế độ xem này.

Tài liệu tham khảo

Hướng dẫn lập phiên bản hàng và khóa giao dịch máy chủ SQL

Máy chủ SQL, Đối tượng khóa


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. GETDATE () Ví dụ trong SQL Server (T-SQL)

  2. Khắc phục Msg 8114 “Lỗi chuyển đổi kiểu dữ liệu varchar thành số” trong SQL Server

  3. Ví dụ về Chuyển đổi "date" thành "smalldatetime" trong SQL Server (T-SQL)

  4. Cách lấy ngày hiện tại trong SQL Server

  5. Có .NET tương đương với newsequentialid () của SQL Server không