|
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模式,让代码知道如何保护自己免受“无赖”事务和其他意外残余的影响。 重要提示 T-SQL的错误处理结构也并非无懈可击,它经常不是按预期的方式或它应该的方法运行。例如,存在许多严重的足以中断当前命令批处理的错误,当这些错误出现时,它让那些可能紧跟在其后的错误处理代码根本没有机会去执行。因此,当出现问题时,即使使用@@ERROR执行代码检查并调用ROLLBACK,还会有错误禁止ROLLBACK执行。这可能是导致孤立事务存在的根本原因,而且也是在开始一个事务前应检查孤立事务的原因。 七、PROTOTYPE(原型) 此模式的目标:使用一种原型实例指定要创建对象的类型,并且通过复制原型创建新的对象。 1、最常见的实现方式是SELECT...INTO结构 SELECT * INTO newCustomers FROM Customers SELECT * INTO newCustomers FROM Customers WHERE country='UK' 注:通过指定一个列列表、WHERE子句、GROUP BY或HAVING子句,可在传送过程中修改原型。 2、复制表结构(T-SQL惯例中也曾提过) SELECT * INTO newCustomers FROM Customers WHERE 1 = 2 或 SELECT TOP 0 * INTO newCustomers FROM Customers 注:通过错误的WHERE条件或不存在的行实现了复制表结构的功能 3、复制表时指定新数据 SELECT IDENTITY(int,1,1) AS CustNo,* INTO newCustomers FROM Customers 注:还可指定新列、通过联接选取来自其他表或视图的列、约束或函数等许多的可能性。 八、Singleton(单例) 此模式目标:确保在任何给定时间只存在一个类实例并且提供访问该实例的路径。 严格说,在关系数据库中,对于面向对象类的等价物是表。类的一个实例就是表中的一行。因此,Singleton模式的最显而意见的实现就是确保表中只包含一行。 CREATE TABLE LastCustNo (LastCustNo int) GO INSERT LastCustNo VALUES(1) GO CREATE TRIGGER LastCustNoInsert ON LastCustNo FOR INSERT AS IF (SELECT COUNT(*) FROM LastCustNo) > 1 BEGIN RAISERROR('You May Not insert more than one row into this table!',16,10) ROLLBACK TRAN END GO INSERT LastCustNo VALUES(2) --由于触发器的原因,插入失败 GO SELECT * FROM LastCustNo 注:由于触发器的原因,在任何时刻只允许在表中插入一行,如果表中已包含至少一行,在试图插入新的一行时将导致错误并回滚事务。 上一页 [1] [2] [3] [4] 下一页 |