您的位置:首页 > 数据库

技巧:SQL Server中写存储过程需注意的几点事项

2007-11-14 09:24 369 查看
对于开发管理类系统的程序员,写存储过程可能是经常用到的,要保证存储过程的稳定我觉得需注意以下几点

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 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sql server 存储 优化