插入表时死锁MS-SQL

时间:2019-04-19 19:41:54

标签: sql-server python-3.x multithreading deadlock

我正在使用以下查询在各自的历史表中插入给定表发生的更改。我正在为python中的多个表同时执行同一查询(更改表名和数据库)。历史表都没有外键。但是,某些处决最终陷入僵局。每个表都有一个唯一的历史表。我不确定如何解决该问题。是因为我在所有过程中都使用了具有相同名称的变量表吗?

declare @name_tab table (name_column varchar(200),
                       dtype varchar(200))
declare @columns varchar(max)
declare @query varchar(max)
declare @database varchar(200)
declare @table_name varchar(200)
set @database = '%s' 
set @table_name = '%s'

insert into @name_tab
select c.name as name_column,
        t.name as dtype
from sys.all_columns c
INNER JOIN sys.types t
    ON t.system_type_id = c.system_type_id
where OBJECT_NAME(c.object_id) = @table_name

set @columns= stuff((select ','+name_column from @name_tab FOR XML PATH('')),1, 1, '') 

set @query= 'insert into ' +@database+'..'+'HISTORY_'+@table_name+' select super_q.* from' +
        '(select cast (GETDATE() as smalldatetime) as TIME_MODIFIED, new_info.* from '+
        '(SELECT ' + @columns + ' From '+@database+'..'+@table_name + 
        ' except ' +
        'SELECT ' + @columns + ' From '+@database+'..'+'HISTORY_'+@table_name + ') new_info) as super_q'

          execute(@query) 

我从system_health获得了这个样本 enter image description here

1 个答案:

答案 0 :(得分:0)

似乎某些并发进程正在同时更改或创建表。死锁XML应该包含有关正在发生的事情的其他详细信息。

但是无论实际原因是什么,解决方案都很简单。使用上面的脚本在静态SQL中生成触发器主体,因此您不必为每个插入查询目录。

在数据库中创建一个名为admin.GenerateHistoryTables和一个名为admin.GenerateHistoryTriggers的过程,并提前运行这些 来安装历史记录表并连接触发器。

或者停止重新发明轮子,并使用Change Data CaptureTemporal Tables