需要针对执行存储过程进行事务回滚,因为是程序调用存储过程可能执行时网络中断,导致存储过程执行了一半,现在需要加上一个事务来控制这种异常情况的发生,事务用的比较浅,不知道下面这个存储过程能否满足我所说的情况?
另外能都实现限定执行该存储过程的时间,超过限定时间就报错事务回滚?
ALTER proc [dbo].[Test_shiwu]
as
begin  set implicit_transactions on; -- 启动隐式事务  begin try 
insert into shiwu (shiwu) values ('1'); 
insert into shiwu (shiwu) values ('2'); 
insert into shiwu (shiwu) values ('3'); 
insert into shiwu (shiwu) values ('4'); 
insert into shiwu (shiwu) values ('5'); 
insert into shiwu (shiwu) values ('6'); 
insert into shiwu (shiwu) values ('7'); 
insert into shiwu (shiwu) values ('8'); 
insert into shiwu (shiwu) values ('9'); 
insert into shiwu (shiwu) values ('10'); 
commit transaction; 
end try 
begin catch 
select ERROR_NUMBER() as errornumber 
rollback transaction; --回滚事务 
end catch  set implicit_transactions off; --关闭隐式事务 endSQL事务存储过程超时

解决方案 »

  1.   

    其实insert已经是一个隐式事务了,不过你可以用begin tran 然后包住你那堆insert,没必要用set,set会导致重编译
      

  2.   

    你用了BEGIN TRAN了还启动隐士事务干嘛? 关于执行多久报错可以在。NET中有一个CommandTimeout中可以用,在数据库中可以尝试SET QUERY_GOVERNOR_COST_LIMIT: http://msdn.microsoft.com/zh-cn/library/ms176100.aspx。如果是全局的可以在SSMS中设置或者
    EXEC sys.sp_configure N'query governor cost limit', N'300'
    GO
    RECONFIGURE WITH OVERRIDE
    GO
      

  3.   


    这个存储过程只是一个例子,实际的存储过程里面insert、update等操作都有,还有游标循环处理,前台程序调用的时候可能会意外中断,导致我后台存储过程操作了一半,所以想加个事务来实现整个存储过程的回滚,另外担心调用执行时间过长,希望限定时间,比如30秒未执行完成就自动中断跳出并回滚,只是有这样的想法,不知道SQL怎么实习
      

  4.   

    右键你的sqlserver实例→属性→这里有设置超时的。
      

  5.   

    其实QUERY_GOVERNOR_COST_LIMIT只是查询分析器预估执行需要的时间,如果查询分析器认为需要的时间超过SET的值就会直接报错而不执行,不知道是否可以满足你的要求。另外对于SQL TIMEOUT都是Client选项的控制,比如。NET等等。当然SSMS也有,如图。
      

  6.   


    预估的话这个效果不行,应该是在执行的时候如果执行时间达到30秒就自动报错回滚。另外选项里面设置应该是针对所有查询操作的,我需要的是特定某个查询超时报错
    像我刚才说的你要再应用程序中设置,因为这个是Client端的设定而不是数据库。