Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да симулирам DEADLOCK на SQL Server?

Можете да създадете блокиране, като използвате стъпките, показани по-долу. Първо създайте глобалните временни таблици с примерни данни.

--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

Сега отворете два празни прозореца за заявки в SSMS. Поставете кода за сесия 1 в единия прозорец на заявката и кода за сесия 2 в другия прозорец на заявката. След това изпълнете всяка от двете сесии стъпка по стъпка, като се движите напред и назад между двата прозореца на заявката, както е необходимо. Имайте предвид, че всяка транзакция има заключване на ресурс, за който другата транзакция също иска заключване.

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>
===========================================================

Резултатът е задънена улица; една транзакция завършва, а другата транзакция е прекъсната и на клиента се изпраща съобщение за грешка 1205.

Затворете прозорците на SSMS заявка за „Сесия 1“ и „Сесия 2“, за да извършите (или върнете назад) всички отворени транзакции. И накрая, почистете временните таблици:

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. Отменете оптимизатора на заявки за вашите T-SQL присъединявания с FORCEPLAN

  2. Гарантирано ли е, че ръководствата са уникални?

  3. Имитация в изгледи на SQL Server?

  4. Не може да се прекрати извършеното връщане на SPID транзакция

  5. Получаване на номер на седмица от дата в MS SQL Server 2005?