ฉันจะแนะนำคุณผ่านตัวอย่างดังนั้นคุณจะเห็นว่าทำไมมันใช้เวลานาน สร้างฐานข้อมูลเปล่าสำหรับการทดสอบนี้
CREATE DATABASE [TestFK]
GO
สร้าง 2 ตาราง
USE [TestFK]
GO
CREATE TABLE dbo.[Address] (
ADDRESSID INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
Address1 VARCHAR(50),
City VARCHAR(50),
[State] VARCHAR(10),
ZIP VARCHAR(10));
GO
CREATE TABLE dbo.Person (
PersonID INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
LastName VARCHAR(50) NOT NULL,
FirstName VARCHAR(50),
AddressID INT);
GO
การสร้างข้อ จำกัด Foreign Key ในตาราง Person
USE [TestFK]
GO
ALTER TABLE dbo.Person ADD CONSTRAINT FK_Person_AddressID FOREIGN KEY (AddressID)
REFERENCES dbo.Address(AddressID)
GO
แทรกข้อมูลบางส่วนลงในทั้งสองตาราง
USE [TestFK]
GO
INSERT dbo.Address (Address1,City,[State],Zip)
SELECT '123 Easy St','Austin','TX','78701'
UNION
SELECT '456 Lakeview','Sunrise Beach','TX','78643'
GO
INSERT dbo.Person (LastName,FirstName,AddressID)
SELECT 'Smith','John',1
UNION
SELECT 'Smith','Mary',1
UNION
SELECT 'Jones','Max',2
GO
เปิดหน้าต่างแบบสอบถามใหม่และเรียกใช้สิ่งนี้ (อย่าปิดหน้าต่างเมื่อแบบสอบถามเสร็จสมบูรณ์)
USE [TestFK]
GO
BEGIN TRAN
INSERT dbo.Person (LastName,FirstName,AddressID)
SELECT 'Smith1','John1',1
UNION
SELECT 'Smith1','Mary1',1
UNION
SELECT 'Jones1','Max1',2
เปิดหน้าต่างแบบสอบถามอื่นและเรียกใช้สิ่งนี้
USE [TestFK]
GO
ALTER TABLE dbo.person DROP CONSTRAINT FK_Person_AddressID
คุณจะเห็นว่าคุณมีข้อ จำกัด การปล่อยจะยังคงทำงานต่อไป (รอ) และตอนนี้เรียกใช้แบบสอบถามเพื่อดูว่าทำไมมันทำงานอีกต่อไปและสิ่งที่ล็อคมันกำลังรอ
SELECT * FROM sys.dm_os_waiting_tasks
WHERE blocking_session_id IS NOT NULL;
เมื่อคุณส่งการดำเนินการแทรกข้อ จำกัด การปล่อยจะเสร็จสมบูรณ์ทันทีเนื่องจากตอนนี้คำสั่งดร็อปสามารถรับการล็อกที่ต้องการ
สำหรับกรณีของคุณคุณต้องตรวจสอบให้แน่ใจว่าไม่มีเซสชันใดกำลังถือล็อคที่เข้ากันได้ซึ่งจะป้องกันข้อ จำกัด การปล่อยเพื่อรับล็อค / ล็อคที่จำเป็น