對於開發管理類系統的程序員,寫存儲過程可能是經常用到的,要保證存儲過程的穩定我覺得需注意以下幾點
1、事務完整
我覺得這是一個存儲過程所必須的也是最重要,如果數據都不能完整,那將是一個很大的問題。其實事務是最簡單也是最容易出現的問題。
比如備份導表,在備份的過程中如果某一步操作出錯都需要回滾事務,否則將導致數據丟失。
2、事務安全級別
事務的安全級別太高很可能在用戶數據比較多的情況下容易出錯。
語法
SET TRANSACTION ISOLATION LEVEL
{ READ COMMITTED
| READ UNCOMMITTED
| REPEATABLE READ
| SERIALIZABLE
}
參數
READ COMMITTED
指定在讀取數據時控制共享鎖以避免髒讀,但數據可在事務結束前更改,從而產生不可重複讀取或幻像數據。該選項是 SQL Server 的默認值。
READ UNCOMMITTED
執行髒讀或 0 級隔離鎖定,這表示不發出共享鎖,也不接受排它鎖。當設置該選項時,可以對數據執行未提交讀或髒讀;在事務結束前可以更改數據內的數值,行也可以出現在數據集中或從數據集消失。該選項的作用與在事務內所有語句中的所有表上設置 NOLOCK 相同。這是四個隔離級別中限制最小的級別。
REPEATABLE READ
鎖定查詢中使用的所有數據以防止其他用戶更新數據,但是其他用戶可以將新的幻像行插入數據集,且幻像行包括在當前事務的後續讀取中。因爲併發低於默認隔離級別,所以應只在必要時才使用該選項。
SERIALIZABLE
在數據集上放置一個範圍鎖,以防止其他用戶在事務完成之前更新數據集或將行插入數據集內。這是四個隔離級別中限制最大的級別。因爲併發級別較低,所以應只在必要時才使用該選項。該選項的作用與在事務內所有 SELECT 語句中的所有表上設置 HOLDLOCK 相同。
註釋
一次只能設置這些選項中的一個,而且設置的選項將一直對那個連接保持有效,直到顯式更改該選項爲止。這是默認行爲,除非在語句的 FROM 子句中在表級上指定優化選項。
SET TRANSACTION ISOLATION LEVEL 的設置是在執行或運行時設置,而不是在分析時設置。
3、SET ROWCOUNT
經常會遇到這種情況,更新的時候只更新了表中部分數據,所以在存儲過程前面一般會加上SET ROWCOUNT 0
4、錯誤信息的提示
一般情況下我都會定義一個變量來保存是哪步執行出錯,然後再把錯誤返回,便於調試程序。
下面是我提供的一個存儲過程的模板
CREATE PROCEDURE 存儲過程名
AS
declare @return_str varchar(200)
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET NOCOUNT ON
SET ROWCOUNT 0
set @return_str='存儲過程出錯'
begin tran
步1
if @@ERROR<>0
begin
set @return_str='步1出錯'
goto error
end
..............
set @return_str='OK'
commit tran
SET NOCOUNT OFF
return 1
error:
rollback tran
raiserror (@return_str,1,2)
return 0