sql >> Database >  >> RDS >> Sqlserver

Hoe DEADLOCK op SQL Server te simuleren?

U kunt een impasse creëren door de onderstaande stappen te volgen. Maak eerst de globale tijdelijke tabellen met voorbeeldgegevens.

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

Open nu twee lege queryvensters in SSMS. Plaats de code voor sessie 1 in het ene vraagvenster en de code voor sessie 2 in het andere vraagvenster. Voer vervolgens elk van de twee sessies stap voor stap uit en ga zo nodig heen en weer tussen de twee queryvensters. Merk op dat elke transactie een vergrendeling heeft op een resource waarvoor de andere transactie ook een vergrendeling aanvraagt.

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

Een impasse resulteert; één transactie is voltooid en de andere transactie wordt afgebroken en foutmelding 1205 wordt naar de klant gestuurd.

Sluit de SSMS-queryvensters voor "Sessie 1" en "Sessie 2" om openstaande transacties vast te leggen (of terug te draaien). Ten slotte, ruim de tijdelijke tabellen op:

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



  1. Oracle SQL - Som en groepeer gegevens per week

  2. Entity framework 5.0 code-first met MySQL in WPF

  3. Firebase FCM-token - Wanneer naar de server verzenden?

  4. Wat is het verschil tussen MyISAM en InnoDB?