做乙個序列執行的儲存過程

2021-07-30 19:52:53 字數 3335 閱讀 3706

--做乙個序列執行的儲存過程

use tempdb

go--1. 日誌表,用於監控

if object_id('[dbo].[dba_proc_log]') is not null

drop table [dbo].[dba_proc_log]

gocreate table [dbo].[dba_proc_log](

[logid] [bigint] identity(1,1) not null,

[procname] [varchar](50) not null,

[begintime] [datetime] not null default (getdate()),

[endtime] [datetime] not null default ('1900-01-01'),

[elapsedseconds] as (case when [endtime]

[errmsg] [nvarchar](max) not null default (''),

[remark] [nvarchar](max) not null default (''),

[succeeded] as (case when [endtime]'' then (0) else (1) end),

[checked] [bit] not null default ((0)),

primary key clustered

( [logid] asc

)with (pad_index = off, statistics_norecompute = off, ignore_dup_key = off, allow_row_locks = on, allow_page_locks = on) on [primary]

) on [primary] textimage_on [primary]

--2. 資料表,用於測試更新

if object_id('[dbo].[testtable]') is not null

drop table [dbo].testtable

gocreate table [dbo].testtable(id int not null primary key,[name] nvarchar(20) not null,cnt int not null)

insert into dbo.testtable(id,name,cnt) values(1,'xiaoming',1)

--3. 測試儲存過程go(

@id int=1,

@waitseconds int=1,

@locktimeoutseconds int=30)as

begin

set nocount on

declare @logid bigint

set @logid=@@identity;

begin transaction

--檢測當前是否能獲取到鎖

/*0 鎖已同時成功授予。

1 在等待釋放其他不相容鎖後成功授予鎖。

-1 鎖請求超時。

-2 鎖請求被取消。

-3 選擇鎖請求作為死鎖犧牲品。

-999 指示引數驗證或其他呼叫錯誤。

*/ declare @lockresult int

set @locktimeoutseconds=@locktimeoutseconds*1000

@lockmode = 'exclusive',

@lockowner='transaction',

@locktimeout = @locktimeoutseconds

/*以這個需求而言,@lockowner 使用 transaction 比較適合。

如果 @lockowner 是使用 transaction ,則表示如果該交易 commit 或是 rollback ,就會釋放這個鎖定。*/

--如果沒有拿到鎖,則不再操作

if @lockresult not in (0,1)

begin

rollback transaction

raiserror ('未能獲取到鎖,鎖返回值:%d', -- message text.

16, -- severity.

1, -- state.

@lockresult -- first argument.

);--插入錯誤日誌

update dbo.dba_proc_log set [endtime]=getdate(),errmsg='未取得鎖',remark='鎖返回值:'+cast(@lockresult as varchar(10))

where logid=@logid

return

end--拿到鎖,先等待再更新

declare @sql nvarchar(max)

set @sql='waitfor delay ''00:00:'+ case when @waitseconds<10 then '0' else '' end + cast(@waitseconds as varchar(2))+''''

print @sql

exec (@sql)

--waitfor delay '00:00:01'

update dbo.testtable set cnt=cnt+1 where id=@id

update dbo.dba_proc_log set [endtime]=getdate(),remark='鎖返回值:'+cast(@lockresult as varchar(20))

where logid=@logid

--釋放鎖

commit transaction

endgo

第一次測試:

執行: @id =1,

@waitseconds =1,

@locktimeoutseconds =30

執行結果:

第二次測試:

執行: @id =1,

@waitseconds =2,

@locktimeoutseconds =1

結果:

在乙個儲存過程裡面執行另乙個儲存過程的應用

alter procedure dbo voucheroutbound backinsurance add the parameters forthe stored procedure here iu id int,icc id int,ic id int,uv currentno varchar ...

乙個儲存過程

create or replace package abc zys is procedure daily census end abc zys 建乙個包,包中有儲存過程daily census。不涉及任何引數。create or replace package body abc zys is pro...

乙個儲存過程

首先是建立儲存過程.drop procedure if exists externalcalltocomplete delimiter create procedure externalcalltocomplete begin drop table if exists temp1 create ta...