我遇到了问题,我想就完成这项任务的最佳方法提出一些意见。
我正在实施的流程是大型数据库的清除解决方案。这些表可以具有可变数量的行,可以从几千到几百万。该过程将只删除特定年份的数据。分区不是一个选项。
我有一些初始密钥表被选中以启动进程,从这些表中我将使用为此目的构建的一些存储过程递归删除数据(为了维护数据完整性并仅删除必要的数据)
我正在使用SSIS能够同时在多个表中启动数据删除,但我遇到锁定问题。
删除过程如下:
我试过了:
在SSIS中,我将serializable作为事务的默认隔离。
我的主要问题是,因为我必须在同一个事务中执行一些DML和DDL,这需要一些时间来执行,我希望所有需要获取某个锁的任务等待锁释放并且不会成为僵局受害者(与互斥锁非常相同)。
在此操作期间,数据库将没有任何活动,只会执行此过程。
这是我用来删除数据的代码,这里是死锁的来源。
select @query = N'
BEGIN TRANSACTION;
DECLARE @result int;
EXEC @result = sp_getapplock @Resource = ''[dbo].'+@dep_tbl_nm+''', @LockMode = ''Exclusive'', @LockOwner = ''Session'', @LockTimeout = -1;
EXEC CreateIndexes ''dbo.'+@dep_tbl_nm+'''
EXEC CreateCoveringIndexes '''+@tbl_nm+''','''+@dep_tbl_nm+''','''+@dep_tmp_tbl_nm+'''
WHILE(1=1)
BEGIN
DELETE TOP(50000) FROM a OUTPUT deleted.* into '+@dep_tmp_tbl_nm+' FROM dbo.'+ @dep_tbl_nm + ' AS A INNER JOIN '+@tmp_tbl_nm+' AS B ON ' + @on_list +'
if(@@ROWCOUNT = 0)
break;
END
exec (''ALTER INDEX ALL ON '+@dep_tbl_nm+' REBUILD WITH (FILLFACTOR = 80)'')
COMMIT TRANSACTION;'
print(@query)
exec(@query)
欢迎评论
此致