技巧:SQL Server中寫存儲過程需注意的幾點事項

對於開發管理類系統的程序員,寫存儲過程可能是經常用到的,要保證存儲過程的穩定我覺得需注意以下幾點

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 

發佈了20 篇原創文章 · 獲贊 1 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章