对于开发管理类系统的程序员,写存储过程可能是经常用到的,要保证存储过程的稳定我觉得需注意以下几点
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