sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan simulerer man DEADLOCK på SQL Server?

Du kan skabe et dødvande ved at bruge trinene vist nedenfor. Først skal du oprette de globale midlertidige tabeller med eksempeldata.

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

Åbn nu to tomme forespørgselsvinduer i SSMS. Placer koden til session 1 i det ene forespørgselsvindue og koden til session 2 i det andet forespørgselsvindue. Udfør derefter hver af de to sessioner trin for trin, og gå frem og tilbage mellem de to forespørgselsvinduer efter behov. Bemærk, at hver transaktion har en lås på en ressource, som den anden transaktion også anmoder om en låsning på.

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

En dødvande resulterer; en transaktion afsluttes, og den anden transaktion afbrydes, og fejlmeddelelse 1205 sendes til klienten.

Luk SSMS-forespørgselsvinduerne for "Session 1" og "Session 2" for at begå (eller rulle tilbage) eventuelle åbne transaktioner. Til sidst skal du rydde op i de midlertidige tabeller:

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



  1. Problemer med UTF-8-tegn; det, jeg ser, er ikke det, jeg har gemt

  2. Sådan installeres Oracle Linux Automation Manager (alias "Oracle Ansible Tower")

  3. Vis dagens emne

  4. Hvad er datatypen, der skal bruges til en beskrivelse?