技巧: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
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
相关文章推荐
- oracle 存储过程的基本语法 及注意事项
- 存储过程的注意事项
- 存储过程的好处和一些注意事项
- oracle 存储过程的基本语法 及注意事项
- oracle 存储过程的基本语法 及注意事项
- oracle 存储过程的基本语法及注意事项
- oracle 存储过程的基本语法 及注意事项
- dbvisualizer客户端执行存储过程和函数(方法)注意事项
- oracle 存储过程的基本语法 及注意事项
- oracle 存储过程的基本语法 及注意事项
- oracle 存储过程的基本语法 及注意事项
- 存储过程优化注意事项
- 使用CallableStatement调用存储过程注意事项
- oracle 存储过程的基本语法 及注意事项
- 创建和使用存储过程的注意事项
- oracle 存储过程的基本语法 及注意事项
- 数据库的存储过程(理解,示例,注意事项,异常分析)
- SQL Server通过储存过程实现批量删除注意事项
- Cognos调用存储过程及注意事项
- oracle 存储过程的基本语法 及注意事项