Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak symulować DEADLOCK na SQL Server?

Możesz utworzyć zakleszczenie, wykonując czynności przedstawione poniżej. Najpierw utwórz globalne tabele tymczasowe z przykładowymi danymi.

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

Teraz otwórz dwa puste okna zapytań w SSMS. Umieść kod sesji 1 w jednym oknie zapytania, a kod sesji 2 w drugim oknie zapytania. Następnie wykonaj każdą z dwóch sesji krok po kroku, przechodząc tam iz powrotem między dwoma oknami zapytań zgodnie z wymaganiami. Zwróć uwagę, że każda transakcja ma blokadę na zasobie, na który inna transakcja również żąda blokady.

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

Wynikiem impasu; jedna transakcja kończy się, a druga zostaje przerwana, a do klienta wysyłany jest komunikat o błędzie 1205.

Zamknij okna zapytań SSMS dla "sesji 1" i "sesji 2", aby zatwierdzić (lub wycofać) wszystkie otwarte transakcje. Na koniec wyczyść tabele tymczasowe:

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. Określ rozmiar wiersza dla tabeli

  2. Czy istnieje tabela zawierająca listę opisów sysobjects.xtype?

  3. Jakie są główne różnice w wydajności między typami danych varchar i nvarchar SQL Server?

  4. Klauzula GDZIE znaleźć wszystkie rekordy w określonym miesiącu

  5. Dlaczego SQL Server 2008 blokuje SELECT przy długich transakcjach INSERT?