【发布时间】:2015-05-21 14:03:04
【问题描述】:
此 DDL 语句中是否有任何内容可能导致系统挂起并创建长时间运行的查询?
-- Abort on any error
SET XACT_ABORT ON
GO
-- FUll isolation
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
GO
BEGIN TRANSACTION
GO
CREATE TABLE ClientPayerCrosswalkMapping
(
id INT IDENTITY(1, 1) NOT NULL,
lbxid INT NOT NULL,
ClientPayerID NVARCHAR(80),
CONSTRAINT PK_ClientPayerCrosswalkMapping_ID PRIMARY KEY CLUSTERED (id),
CONSTRAINT UN_lbxid UNIQUE(lbxid),
CONSTRAINT FK_LockboxDocumentTracking FOREIGN KEY (lbxid)
REFERENCES LockboxDocumentTracking(lbxid)
);
GO
这是在 SQL Server 2005 上,当时系统处于中等负载状态。
这是新表,为什么系统会挂起,我唯一的怀疑是表有一个 CONSTRAINT
【问题讨论】:
-
这里真的需要事务和
SERIALIABLE隔离级别吗?如果它只创建一个表,您可以随时再次删除它,例如如果后续数据填充脚本失败。 -
其实,你为什么需要交易呢?
-
应该有一些记录在填充后插入到该表中,这就是我们有事务的原因。但是是的,它可以在没有交易的情况下执行
-
使用事务包装 DDL 语句可能会出现问题(具有特殊处理的 #temporary 表除外)。尝试将
CREATE TABLE ..移出事务。 -
此外,无论何时您使用
SERIALIZABLE,您都应该预料到可能会有很长的延迟。
标签: sql sql-server ddl