SQL server 数据库 关于 insert into …… select …… from …… 的问题 20
这个存储过程每分钟执行一次单线程(A表中除了插入还有修改[count]=3的都是多线程。)功能:就是将A表[count]>2的数据备份到B表,并将A表中已备份的数据删除掉...
这个存储过程每分钟执行一次单线程(A表中除了插入还有修改[count] = 3 的都是多线程。)
功能:就是将A 表[count] > 2 的数据备份到B表,并将A表中已备份的数据删除掉,
但是有时候A表的一条数据会在B表中备份多条(那个数据在A表中确实就一条),还有我看B表中插入时间都是相隔几毫
秒说明都是一次插入的,
我不明白为什么会出现这种情况
select distinct [id] into #A_temp from A where [count] > 2;
//判断是否有数据
if exists(select [id] from #A_temp)
begin
/**将已发送的记录导入到备份表中**/
insert into
B(
col1,
col2
)
select
col1,col2
from
A with(nolock)
where
[id] in (select [id] from #A_temp);
/**将已发送的记录导入到备份表中**/
--删除已备份的记录
delete from A where [id] in (select [id] from #A_temp);
end 展开
功能:就是将A 表[count] > 2 的数据备份到B表,并将A表中已备份的数据删除掉,
但是有时候A表的一条数据会在B表中备份多条(那个数据在A表中确实就一条),还有我看B表中插入时间都是相隔几毫
秒说明都是一次插入的,
我不明白为什么会出现这种情况
select distinct [id] into #A_temp from A where [count] > 2;
//判断是否有数据
if exists(select [id] from #A_temp)
begin
/**将已发送的记录导入到备份表中**/
insert into
B(
col1,
col2
)
select
col1,col2
from
A with(nolock)
where
[id] in (select [id] from #A_temp);
/**将已发送的记录导入到备份表中**/
--删除已备份的记录
delete from A where [id] in (select [id] from #A_temp);
end 展开
1个回答
展开全部
有可能是存储过程被同时执行多次(上一次还没执行到delete,第二次执行执行到判断是否有数据那里),对此你要使该过程在执行的时候下一条请求跳出或者等待,若是如此做了还会出现这种情况,你还是好好定位数据找情况
追问
不会,他是单线程的
while(true){
执行存储过程
暂停1分钟
}
追答
不瞒你说,其实我也出现过类似你这种情况,可以说我那也是单线程的,后面我就让他执行中另外若有执行这个存过的请求就直接跳出了,后面也没听客户说出现过翻倍的情况。很让人匪夷所思,我觉得是数据库端可能处理请求会搞成多次的了
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询