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

Quản lý giao dịch đồng thời bằng cách sử dụng khóa trong SQL Server

Trong môi trường nhiều người dùng, điều cần thiết là duy trì tính đồng thời cắt ngắn. Các khóa này là cấu trúc trong bộ nhớ có kích thước 96 byte. Vai trò của họ là duy trì tính toàn vẹn, nhất quán của dữ liệu, kiểm soát đồng thời cho mỗi giao dịch. SQL Server tuân theo kiểm tra ACID cho mỗi giao dịch.

  • Đ tomicity:Thuộc tính này đảm bảo rằng một giao dịch liên quan đến hai hoặc nhiều quy trình được cam kết đầy đủ hoặc không có quy trình nào được cam kết.
  • C tính nhất quán:Nó cung cấp cho bạn sự đảm bảo về trạng thái giao dịch đã cam kết. Một giao dịch phải tạo trạng thái dữ liệu mới hoặc trở về trạng thái hiện có (trước giao dịch).
  • Tôi solation:Nó chỉ ra rằng các giao dịch được cách ly với nhau. Nếu một giao dịch đang chạy và nó không gửi dữ liệu, nó sẽ bị tách biệt khỏi các giao dịch khác.
  • Đ độ bền:Độ bền đảm bảo dữ liệu đã cam kết của bạn không bao giờ bị mất. Nó ngăn ngừa lỗi nguồn và hệ điều hành hoặc các lỗi khác do phần mềm gây ra.

Để đảm bảo thuộc tính ACID, SQL Server áp đặt các loại khóa khác nhau trên các đối tượng. Trong trường hợp này, các giao dịch khác cần phải đợi cho đến khi khóa được phát hành.

Chế độ khóa

SQL Server sử dụng các chế độ khóa sau cho mỗi giao dịch.

  • Khóa dùng chung:
    • Trong khóa này, SQL Server cho phép các phiên khác thực hiện các thao tác đã chọn để đọc dữ liệu. Tuy nhiên, nó ngăn cập nhật cho đến khi khóa hoạt động.
    • Nhiều giao dịch có thể áp đặt một khóa dùng chung cùng một lúc trên một hàng hoặc trang.
    • Đây là một khóa phổ biến mà bạn thấy trên các đối tượng cơ sở dữ liệu của mình.

Trong T-SQL sau, chúng tôi truy xuất hồ sơ khách hàng cho một ID khách hàng cụ thể. Hơn nữa, chúng tôi sử dụng chế độ xem quản lý động sys.dm_tran_locks để kiểm tra các khóa hiện có.

BEGIN TRAN
SELECT * FROM [SalesLT].[Customer] WITH (HOLDLOCK)
WHERE CustomerID=1
    
SELECT resource_type, request_mode, resource_description
FROM   sys.dm_tran_locks
WHERE  resource_type <> 'DATABASE'

ROLLBACK

Như được hiển thị bên dưới, nó có một khóa chia sẻ trên id tài nguyên đã cho (8194443284a0):

  • Khóa (X) độc quyền:
    • SQL Server sử dụng khóa riêng (X) cho các hoạt động DML (Xóa, Chèn hoặc Cập nhật), yêu cầu sửa đổi dữ liệu hàng hoặc trang.
    • Nó ngăn các mục đích sử dụng khác truy cập vào tài nguyên cho đến khi khóa được đặt.
    • Máy chủ SQL chỉ có thể có một khóa riêng trên một trang hoặc hàng cho một giao dịch.

Trong ví dụ này, chúng tôi muốn cập nhật các bản ghi cho id khách hàng 1. Do đó, SQL Server yêu cầu một khóa riêng trên tài nguyên. Không có giao dịch nào khác có thể có được khóa độc quyền trên tài nguyên này cho đến khi giao dịch hoàn tất.

BEGIN TRAN
UPDATE [SalesLT].[Customer] 
SET Suffix='Mr.'  
WHERE CustomerID=1
    
SELECT resource_type, request_mode, resource_description
FROM   sys.dm_tran_locks
WHERE  resource_type <> 'DATABASE'

ROLLBACK
  • Cập nhật (U) khóa:
    • Khóa Cập nhật tương tự như một khóa độc quyền. Nó có thể được ghi vào hồ sơ khi có khóa dùng chung.
    • Khóa cập nhật đặt một khóa dùng chung khác trên một hàng cụ thể. Khi nó có thể sửa đổi các bản ghi, SQL Server sẽ chuyển đổi khóa Cập nhật thành khóa dành riêng.
    • Máy chủ SQL không thể đặt khóa chia sẻ trên tài nguyên có khóa Cập nhật.
    • Bạn cũng có thể sử dụng WITH UPDLOCK để buộc khóa cập nhật.

Ví dụ sau cho thấy một khóa cập nhật trên id tài nguyên (8194443284a0):

BEGIN TRAN
SELECT * FROM [SalesLT].[Customer] WITH (UPDLOCK)
WHERE CustomerID=1
    
SELECT resource_type, request_mode, resource_description
FROM   sys.dm_tran_locks
WHERE  resource_type <> 'DATABASE'

ROLLBACK
  • Khóa ý định:
    • Mục đích của nó là thông báo cho một giao dịch về ý định lấy khóa. Nó xảy ra khi một giao dịch yêu cầu khóa chia sẻ hoặc khóa riêng đối với các tài nguyên thấp hơn trong hệ thống phân cấp.
    • Giao dịch này không cho phép các giao dịch khác có được một khóa độc quyền trên bảng bằng cách sử dụng một khóa có ý định.
    • Dưới đây là các loại khóa mục đích.
      • Khóa Intent Shared (IS):Nó cho biết Máy chủ SQL có ý định đọc các tài nguyên phân cấp thấp hơn bằng cách có được khóa chia sẻ riêng lẻ trên các tài nguyên phân cấp thấp hơn đó.
      • Khóa Intent Exclusive (IX):Nó cho biết Máy chủ SQL có ý định sửa đổi các tài nguyên phân cấp thấp hơn bằng cách lấy một khóa độc quyền trên các tài nguyên phân cấp thấp hơn đó.
      • Khóa Cập nhật ý định (IU):Chỉ có thể nhận được khóa này ở cấp trang đối với các tài nguyên phân cấp thấp hơn và sau khi cập nhật hoàn tất, nó sẽ chuyển đổi thành khóa IX.

Như được hiển thị bên dưới, giao dịch có một khóa độc quyền trên một khóa và nó có một khóa dành riêng cho Ý định ở cấp độ trang.

Khóa chuyển đổi

SQL Server chuyển đổi các loại khóa để hỗ trợ nhiều truy vấn trong một giao dịch. Những khóa này được gọi là khóa chuyển đổi.

  • SIX - Được chia sẻ với khóa Intent Exclusive:Giao dịch SQL Server giữ một khóa chia sẻ trên một số trang và có một khóa độc quyền khóa trên một số hàng.
  • SIU - Giao dịch SQL Server giữ khóa dùng chung trên một số trang và có Cập nhật khóa trên một số hàng.
  • UIX- Cập nhật với Khóa độc quyền có ý định:Giao dịch Máy chủ SQL giữ khóa Cập nhật trên một số trang và có khóa Độc quyền khóa trên một số hàng.

Khóa giản đồ

SQL Server có được hai loại khóa lược đồ.

  • Khóa ổn định của lược đồ (Sch-S):Khóa này được sử dụng khi lược đồ phụ thuộc vào truy vấn biên dịch và kế hoạch thực thi của nó đang được tạo. Khóa Sch-S không chặn bất kỳ quyền truy cập nào vào dữ liệu đối tượng.
  • Khóa sửa đổi lược đồ (Sch-M):Khóa này là kết quả của việc thực thi truy vấn DDL (Ngôn ngữ Định nghĩa Dữ liệu). SQL Server chỉ có thể có một khóa sửa đổi giản đồ trên một đối tượng. Bạn không thể sửa đổi một đối tượng bằng khóa giản đồ này.

Trong ví dụ dưới đây, chúng tôi nhận được cả khóa Sch-S và Sch-M trong khi sửa đổi định nghĩa đối tượng.

BEGIN TRAN
Alter TABLE DemoTable ADD new bit
SELECT resource_type, request_mode, resource_description
FROM   sys.dm_tran_locks
WHERE  resource_type <> 'DATABASE'
ROLLBACK

Khóa khả năng tương thích

Khả năng tương thích của khóa rất hữu ích để kiểm tra các khóa được phép trong trường hợp có nhiều giao dịch trong cùng một tài nguyên đồng thời. Nếu một giao dịch đặt một khóa, khóa mới được đặt bởi một giao dịch khác phải tương thích với nó. Do đó, bạn có thể xem qua danh sách khả năng tương thích của khóa sau và tìm các khóa được hỗ trợ trong nhiều giao dịch.

Khóa báo cáo

SQL Server đã giới thiệu tính năng báo cáo khóa để ngăn chặn quá nhiều khóa có thể gây áp lực cho bộ nhớ. SQL Server xem xét số lượng khóa được giữ trong một lần quét cụ thể và số lượng khóa được giữ bởi toàn bộ giao dịch và bộ nhớ động. SQL Server chuyển đổi khóa cấp thấp thành khóa cấp cao trong leo thang khóa. Ví dụ:nó chuyển đổi khóa hàng thành khóa cấp trang.

Nó sử dụng ngưỡng sau để khóa báo cáo.

  • Ngưỡng bộ nhớ: Ngưỡng bộ nhớ khóa được đặt ở 40% bộ nhớ khóa.
  • Ngưỡng khóa: Nếu số lượng khóa có được trên bảng hoặc chỉ mục hiện tại lớn hơn 5000, thì có thể kích hoạt báo cáo khóa.

Người dùng có thể kiểm soát sự leo thang của khóa bằng cách sử dụng câu lệnh bảng thay đổi. Bạn có thể tắt hoàn toàn báo cáo khóa cho bảng đó bằng cách sử dụng giá trị tham số DISABLE.

ALTER TABLE Table_name SET (LOCK_ESCALATION = < TABLE | AUTO | DISABLE > –One of those options) GO

Bạn có thể tham khảo tài liệu của Microsoft để hiểu chi tiết về báo cáo khóa.

Lưu ý:Bạn không nên tắt báo cáo khóa cho đến khi nó được kiểm tra kỹ lưỡng trong môi trường thấp hơn và chỉ những DBA có kinh nghiệm mới được khuyến nghị sử dụng.

Kết luận

Bài viết này cung cấp tổng quan chi tiết về khóa SQL Server và DMV để giám sát khóa và quá trình leo thang của nó. Khóa là hành vi khá bình thường trong SQL Server và bạn nên làm quen với nó để hiểu cách hoạt động của nhiều giao dịch, mô phỏng và cung cấp dữ liệu nhất quán.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để kết hợp nhiều hàng thành danh sách được phân tách bằng dấu phẩy trong SQL Server 2005?

  2. nhận ID bản ghi SQL mới

  3. Cắt ngắn (không làm tròn) các vị trí thập phân trong SQL Server

  4. Làm thế nào để chuyển đổi số phút sang định dạng hh:mm trong TSQL?

  5. Khóa tổng hợp duy nhất của SQL Server của hai trường với tự động tăng trường thứ hai