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
Post a Comment