带你深入了解T-SQL的十一种设计模式(二)

日期: 2008-06-29 作者:Alizze 来源:TechTarget中国

  五、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


  &#101xec @res = procC


  RETURN (@res)


  GO


  create PROC procA


  AS


  DECLARE @res int


  &#101xec @res = procB


  select @res


  GO


  &#101xec 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


  &#101xec procC @msg OUT


  GO


  create PROC procA


  AS


  DECLARE @msg varchar(128)


  &#101xec procB @msg OUT


  select @msg


  GO


  &#101xec 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


  &#101xec @res = procC


  RETURN (@res)


  GO


  create PROC procA


  AS


  DECLARE @res int


  &#101xec @res = procB


  select @res


  GO


  &#101xec 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


  &#101xec @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


  &#101xec @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


  &#101xec @res = procR


  select @res


  注:通过@@TRANcount<>0可知有活动事务,执行ROLLBACK回滚当前活动连接的所有事务。当SQL Server使用连接池时(对WEB服务器而言相当常见),在实际应用中编写此种逻辑就非常重要。由于一个虚连接可以留下一个打开的事务,该事务会影响使用同一物理连接的后续用户,因此,通过主动地执行Restorer模式,让代码知道如何保护自己免受“无赖”事务和其他意外残余的影响。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

作者

Alizze
Alizze

相关推荐