高手帮小弟分析一个带事务的存储过程?

时间:2022-04-22 15:54:07
CREATE PROCEDURE p_set_time_send
 AS 
begin
SET XACT_ABORT ON
begin tran zhuanyidingshifasong
insert into tb_queue_list select * from tb_set_time_msg where send_time <= getdate()
delete from tb_set_time_msg where send_time <= getdate()
commit tran zhuanyidingshifasong
end
go

请大家帮我分析一下我写的这个带事务的存储过程有没有问题.
这个存储过程的功能:从一个表中把满足一定时间的数据,写到另一个表中.并把刚才满足条件的数据清空.
现在小弟有一点不明,请指点.就是通过insert into tb_queue_list select * from tb_set_time_msg where send_time <= getdate()写入的数据,会不会通过delete from tb_set_time_msg where send_time <= getdate()删除的数据不一样多.
会不会出现:在删除前又有满足条件的数据写入 tb_set_time_msg ,但这些数据没有被写入tb_queue_list.  说明 tb_queue_list,tb_set_time_msg结构一样.

7 个解决方案

#1


学习学习!

#2


在删除的同时有没有新的记录写进去,这个你比我清楚.
我想提醒的是,两次getdate()拿到的时间不保证是一样的咯.

#3


依照这样的写法,理论上讲是会出现你所担心的问题的
就是插入tb_queue_list表的数据可能和你接下来做删除的数据存在出入
建议你将要插入的数据存放到一个只读的临时表,然后依据临时表的内容再做删除,当然也可以使用游标。
我这里说一下游标的方案:
1:将需要删除的数据保存到游标里,select * from tb_set_time_msg where send_time <= getdate() ,游标要这样声明DECLARE YOURCURSOR CURSOR LOCAL STATIC FOR,关键字STATIC可以保证你的游标数据不会因为数据库表里数据的增删而有所改变。
2:在游标循环里,将数据逐一执行tb_queue_list表的插入和tb_set_time_msg表的削除。

#4


我提供的只是一个思路,没有实现,在性能上,自然没有你当前的高,但是,可以解决你的顾虑,你可以参考。也请各路高手不吝赐教!

#5


在删除前又有满足条件的数据写入 tb_set_time_msg ,但这些数据没有被写入tb_queue_list.
事务中的插入操作和删除操作只要条件一样就不会出现楼主担心的问题。
要保持条件一样,关键在使得两次的限制时间一样。
将插入时getdate的值保存在一个参数中,把这个参数作为删除时的时间条件就行了

#6


支持!!!
xujianrj() 的解答,原理讲的一针见血
实现方式也很独特,这样的话楼主只需一个变量,稍加修改就可以用现有的语句完成操作,并保证效率。
学习ing……

#7


学习....

#1


学习学习!

#2


在删除的同时有没有新的记录写进去,这个你比我清楚.
我想提醒的是,两次getdate()拿到的时间不保证是一样的咯.

#3


依照这样的写法,理论上讲是会出现你所担心的问题的
就是插入tb_queue_list表的数据可能和你接下来做删除的数据存在出入
建议你将要插入的数据存放到一个只读的临时表,然后依据临时表的内容再做删除,当然也可以使用游标。
我这里说一下游标的方案:
1:将需要删除的数据保存到游标里,select * from tb_set_time_msg where send_time <= getdate() ,游标要这样声明DECLARE YOURCURSOR CURSOR LOCAL STATIC FOR,关键字STATIC可以保证你的游标数据不会因为数据库表里数据的增删而有所改变。
2:在游标循环里,将数据逐一执行tb_queue_list表的插入和tb_set_time_msg表的削除。

#4


我提供的只是一个思路,没有实现,在性能上,自然没有你当前的高,但是,可以解决你的顾虑,你可以参考。也请各路高手不吝赐教!

#5


在删除前又有满足条件的数据写入 tb_set_time_msg ,但这些数据没有被写入tb_queue_list.
事务中的插入操作和删除操作只要条件一样就不会出现楼主担心的问题。
要保持条件一样,关键在使得两次的限制时间一样。
将插入时getdate的值保存在一个参数中,把这个参数作为删除时的时间条件就行了

#6


支持!!!
xujianrj() 的解答,原理讲的一针见血
实现方式也很独特,这样的话楼主只需一个变量,稍加修改就可以用现有的语句完成操作,并保证效率。
学习ing……

#7


学习....