五、Conveyor(传送)
提供一种通过存储过程链传送信息的机制。与GoF的责任链模式(Chain of Responsibility)相类似。
1、传送返回码
create PROC procC
AS
IF OBJECT_ID(’no_exist’) IS NOT NULL
select * FROM no_exist
ELSE
RETURN (-1)
GO
create PROC procB
AS
DECLARE @res int
exec @res = procC
RETURN (@res)
GO
create PROC procA
AS
DECLARE @res int
exec @res = procB
select @res
GO
exec procA
注:上述代码使用了存储过程的结果代码从过程向过程传递原始返回码的方法,即A调用B,B又调用C,C运行时如出现了错误,则将错误代码-1传送给A。
2、通过输出参数传送消息
create PROC procC
@msg varchar(128) OUT
AS
IF OBJECT_ID(’no_exist’) IS NOT NULL
select * FROM no_exist
ELSE
SET @msg = ’Table dosen’’t exist!’
GO
create PROC procB
@msg varchar(128) OUT
AS
exec procC @msg OUT
GO
create PROC procA
AS
DECLARE @msg varchar(128)
exec procB @msg OUT
select @msg
GO
exec procA
注:可以使用任何数据类型(包括游标)来返回任何想要的信息
3、传送真实错误代码
create PROC procC
AS
DECLARE @err int
IF @@TRANcount = 0 –此全局变量返回当前连接的活动事务数
ROLLBACK TRAN –有意设置的出错语句,因未使用BEGIN TRANSACTION语句
SET @err = @@ERROR
RETURN (@err)
GO
create PROC procB
AS
DECLARE @res int
exec @res = procC
RETURN (@res)
GO
create PROC procA
AS
DECLARE @res int
exec @res = procB
select @res
GO
exec procA
六、Restorer(恢复)
此模式提供一种在出错时清理资源的机制。为避免孤立一个事务,当事务活动时,适当地处理出错条件极其重要。
1、出错时回滚事务
IF OBJECT_ID(’procR’) IS NOT NULL
drop PROC procR
GO
create PROC procR
AS
DECLARE @err int
BEGIN TRAN
update customers SET city = ’Dallas’
select 1/0 –设置一个错误
SET @err = @@ERROR
IF @err <> 0
BEGIN
ROLLBACK TRAN
RETURN (@err)
END
COMMIT TRAN
GO
DECLARE @res int
exec @res = procR
select @res
注:此模式的关键部分是将错误码@@error缓存至变量@err中,如果不缓存@@error,下一执行成功的语句将重置@@error,缓存它后,如出现错误,将检查@errr的值并回滚该活动事务。
2、出错时清除临时表
create PROC procR
AS
DECLARE @err int
create TABLE ##myglobal(c1 int)
insert ##myglobal DEFAULT VALUES
select 1/0 –设置一个错误
SET @err = @@ERROR
IF @err <> 0
BEGIN
drop TABLE ##myglobal
RETURN (@err)
END
drop TABLE ##myglobal
GO
DECLARE @res int
exec @res = procR
select @res
3、主动执行恢复模式
create PROC procR
AS
IF @@TRANcount <> 0 –启动新事务前先回滚旧事务
ROLLBACK TRAN
DECLARE @err int
BEGIN TRAN
update customers SET city = ’Dallas’
select 1/0 –设置一个错误
SET @err = @@ERROR
IF @err <> 0
BEGIN
ROLLBACK TRAN
RETURN (@err)
END
COMMIT TRAN
GO
DECLARE @res int
exec @res = procR
select @res
注:通过@@TRANcount<>0可知有活动事务,执行ROLLBACK回滚当前活动连接的所有事务。当SQL Server使用连接池时(对WEB服务器而言相当常见),在实际应用中编写此种逻辑就非常重要。由于一个虚连接可以留下一个打开的事务,该事务会影响使用同一物理连接的后续用户,因此,通过主动地执行Restorer模式,让代码知道如何保护自己免受“无赖”事务和其他意外残余的影响。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
作者
相关推荐
-
SQL Server 2016新变化:内存中OLTP功能大改进
SQL Server 2016的许多功能得到改进,内存中OLTP(in-memory OLTP)也不例外,包括扩展性、性能以及扩展T-SQL用于使用和管理内存优化表的功能方面。
-
优化T-SQL提升SQL Server数据库性能
本文中提供了八种优化T-SQL代码避免SQL Server数据库性能瓶颈的技巧,我们可以据此优化数据库应用。
-
配置SQL Server数据库恢复模式的两种方法
本文我们讨论了配置SQL Server恢复模式的两种方式,用T-SQL或者SQL Server管理工具都可以修改恢复模式的设置。
-
用T-SQL在SQL Server 2012中创建用户自定义角色
SQL Server 2012中引入了两项功能,即创建用户自定义服务器角色和分配服务器级别的权限。本文为初级DBA给出了一个用户自定义服务器角色的示范用例。