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

Làm thế nào để mô phỏng DEADLOCK trên SQL Server?

Bạn có thể tạo bế tắc bằng cách sử dụng các bước được hiển thị bên dưới. Đầu tiên, tạo các bảng tạm thời chung với dữ liệu mẫu.

--Two global temp tables with sample data for demo purposes.
CREATE TABLE ##Employees (
    EmpId INT IDENTITY,
    EmpName VARCHAR(16),
    Phone VARCHAR(16)
)
GO

INSERT INTO ##Employees (EmpName, Phone)
VALUES ('Martha', '800-555-1212'), ('Jimmy', '619-555-8080')
GO

CREATE TABLE ##Suppliers(
    SupplierId INT IDENTITY,
    SupplierName VARCHAR(64),
    Fax VARCHAR(16)
)
GO

INSERT INTO ##Suppliers (SupplierName, Fax)
VALUES ('Acme', '877-555-6060'), ('Rockwell', '800-257-1234')
GO

Bây giờ hãy mở hai cửa sổ truy vấn trống trong SSMS. Đặt mã cho phiên 1 trong một cửa sổ truy vấn và mã cho phiên 2 trong cửa sổ truy vấn khác. Sau đó thực hiện từng bước một trong hai phiên, qua lại giữa hai cửa sổ truy vấn theo yêu cầu. Lưu ý rằng mỗi giao dịch có một khóa đối với một tài nguyên mà giao dịch khác cũng đang yêu cầu khóa.

Session 1                   | Session 2
===========================================================
BEGIN TRAN;                 | BEGIN TRAN;
===========================================================
UPDATE ##Employees
SET EmpName = 'Mary'
WHERE EmpId = 1
===========================================================
                             | UPDATE ##Suppliers
                             | SET Fax = N'555-1212'
                             | WHERE SupplierId = 1
===========================================================
UPDATE ##Suppliers
SET Fax = N'555-1212'
WHERE SupplierId = 1
===========================================================
<blocked>                    | UPDATE ##Employees
                             | SET Phone = N'555-9999'
                             | WHERE EmpId = 1
===========================================================
                             | <blocked>
===========================================================

Một kết quả bế tắc; một giao dịch kết thúc và giao dịch kia bị hủy bỏ và thông báo lỗi 1205 được gửi đến khách hàng.

Đóng cửa sổ truy vấn SSMS cho "Phiên 1" và "Phiên 2" để cam kết (hoặc khôi phục) bất kỳ giao dịch đang mở nào. Cuối cùng, hãy dọn dẹp các bảng tạm thời:

DROP TABLE ##Employees
GO
DROP TABLE ##Suppliers
GO



  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 thế nào để mô phỏng DEADLOCK trên SQL Server?

  2. Trích xuất URL từ một trang web?

  3. Cách gửi kết quả truy vấn qua email dưới dạng tệp đính kèm trong SQL Server (T-SQL)

  4. Cách chuyển giá trị tên cột làm đối số SQL bằng cách sử dụng trình giữ chỗ

  5. SQL Server là gì? (Định nghĩa, Phiên bản, Phiên bản)