Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana cara mensimulasikan DEADLOCK di SQL Server?

Anda dapat membuat kebuntuan dengan menggunakan langkah-langkah yang ditunjukkan di bawah ini. Pertama, buat tabel temp global dengan data sampel.

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

Sekarang buka dua jendela kueri kosong di SSMS. Tempatkan kode untuk sesi 1 di satu jendela kueri dan kode untuk sesi 2 di jendela kueri lainnya. Kemudian jalankan masing-masing dari dua sesi langkah demi langkah, bolak-balik di antara dua jendela kueri sesuai kebutuhan. Perhatikan bahwa setiap transaksi memiliki penguncian pada sumber daya yang juga diminta oleh transaksi lain untuk dikunci.

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

Hasil kebuntuan; satu transaksi selesai dan transaksi lainnya dibatalkan dan pesan kesalahan 1205 dikirim ke klien.

Tutup jendela kueri SSMS untuk "Sesi 1" dan "Sesi 2" untuk melakukan (atau mengembalikan) semua transaksi yang terbuka. Terakhir, bersihkan tabel temp:

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. Apa itu prosedur tersimpan?

  2. SQL Server:Fungsi Bernilai Tabel vs. Prosedur Tersimpan

  3. CONVERT() dari Tanggal/Waktu ke Contoh String di SQL Server

  4. Pemulihan cadangan database SQL Server pada versi yang lebih rendah

  5. Fungsi vs Prosedur Tersimpan