tsql - first attempt at a sproc transaction -


i trying write sproc transaction. can tell me if there issues code below, or if work intended?

alter procedure [dbo].[deletemetricmeter]  (     @sectionid int,     @metricmeterid int,     @result bit output )   declare @metricmetercount int declare @err int declare @rowcount int  set xact_abort on  begin tran  select @metricmetercount = count(*) lumetricmeters fksectionid = @sectionid  select @err = @@error, @rowcount = @@rowcount   if (@err <> 0) or (@rowcount = 0) begin     goto on_error            end  delete lumetricmeterlist pkmetricmeterid = @metricmeterid  select @err = @@error, @rowcount = @@rowcount   if (@err <> 0) or (@rowcount = 0) begin     goto on_error            end   delete lumetricmeters pkmetricmeterid = @metricmeterid  select @err = @@error, @rowcount = @@rowcount   if (@err <> 0) or (@rowcount = 0) begin     goto on_error            end  if (@metricmetercount = 1) begin     delete lumetricsections     pksectionid = @sectionid      select @err = @@error, @rowcount = @@rowcount       if (@err <> 0) or (@rowcount = 0)     begin         goto on_error                end end  commit tran set @result = 1 return @result  on_error:     rollback tran     set @result = 0     return @result 

there few issues procedure:

  • you should not evaluate rowcount unless indicates error. when there no data deleted there no need rollback.
  • your code not thread safe. metricmetercount query should changed prevent other threads performing delete in between select & execution of delete:

    select @metricmetercount = count(*)    lumetricmeters (xlock, serializable)  fksectionid = @sectionid   

i write code this:

alter procedure [dbo].[deletemetricmeter]  (     @sectionid int,     @metricmeterid int,     @result bit output )   declare @metricmetercount int declare @err int declare @rowcount int  set xact_abort on  begin tran  delete lumetricmeterlist   pkmetricmeterid = @metricmeterid  select @err = @@error  if (@err <> 0)      goto on_error             delete lumetricmeters  pkmetricmeterid = @metricmeterid  select @err = @@error  if (@err <> 0)      goto on_error             if exists (select *               lumetricmeters (xlock, serializable)              fksectionid = @sectionid) begin     delete lumetricsections       pksectionid = @sectionid      select @err = @@error     if (@err <> 0)          goto on_error            end  commit tran  return (0)  on_error:     rollback tran     return (-1) go 

note: return values should 0 success , negative number failure.


Comments

Popular posts from this blog

apache - Add omitted ? to URLs -

redirect - bbPress Forum - rewrite to wwww.mysite prohibits login -

php - How can I stop spam on my custom forum/blog? -