Tôi sẽ hướng dẫn bạn qua một ví dụ như vậy, bạn có thể thấy lý do tại sao nó mất nhiều thời gian. Tạo một cơ sở dữ liệu trống cho bài kiểm tra này.
CREATE DATABASE [TestFK]
GO
Tạo 2 bảng.
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
Tạo một ràng buộc khóa ngoài trên bảng Person.
USE [TestFK]
GO
ALTER TABLE dbo.Person ADD CONSTRAINT FK_Person_AddressID FOREIGN KEY (AddressID)
REFERENCES dbo.Address(AddressID)
GO
Chèn một số dữ liệu vào cả hai bảng.
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
Mở một cửa sổ truy vấn mới và chạy nó (không đóng cửa sổ sau khi truy vấn được hoàn thành).
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
Mở một cửa sổ truy vấn khác và chạy này.
USE [TestFK]
GO
ALTER TABLE dbo.person DROP CONSTRAINT FK_Person_AddressID
Bạn sẽ thấy bạn thả ràng buộc sẽ tiếp tục chạy (chờ) và bây giờ chạy truy vấn để xem tại sao nó chạy lâu hơn và khóa nào nó đang chờ.
SELECT * FROM sys.dm_os_waiting_tasks
WHERE blocking_session_id IS NOT NULL;
Khi bạn cam kết thao tác chèn của mình, ràng buộc thả sẽ hoàn thành ngay lập tức vì bây giờ câu lệnh thả có thể có được khóa yêu cầu.
Đối với trường hợp của bạn, bạn cần đảm bảo rằng không có phiên nào đang giữ khóa tương thích, điều này sẽ ngăn chặn ràng buộc thả để có được khóa / khóa cần thiết.