AS
BEGIN
BEGIN TRY
BEGIN TRANSACTION
PRINT ‘In [SPMultiDataToUserInfo] Transactions: ‘ + Convert(varchar, @@TRANCOUNT);
— SET NOCOUNT ON added to prevent extra result sets from
— interfering with SELECT statements.
–SET NOCOUNT ON;
— Hard code inserted data.
INSERT INTO UserInfo VALUES(‘Cris’, 1);
EXEC SPAddDataToUserInfo
INSERT INTO UserInfo VALUES(‘Ada’, 32);
COMMIT TRANSACTION
END TRY
BEGIN CATCH
PRINT ‘Error in [SPMultiDataToUserInfo]: ‘ + ERROR_MESSAGE();
IF (@@TRANCOUNT > 0)
ROLLBACK TRANSACTION
PRINT ‘Rolled back successful in SPMultiDataToUserInfo Transactions: ‘ + Convert(varchar, @@TRANCOUNT);
END CATCH
END
GO
现在我们增加了事务计数器的判断,当计数器为0时,不进行事务回滚,这样就没有了之前事务计数器异常了。

图9 存储过程执行消息
现在对于事务我们有了进一步的了解,而且把以上的事务定义成为一个日常通用的模板,如下给出了一个基本的Transaction模板。
— =============================================
— Transaction Temp
— =============================================
BEGIN TRY
BEGIN TRANSACTION
—
— You code here.
—
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF (@@TRANCOUNT > 0)
— Adds store procedure
— Writes the error into ErrorLog table.
ROLLBACK TRANSACTION
END IF
END CATCH
1.1.3 总结
事务是作为单个逻辑工作单元执行的一系列操作。可以是一条SQL语句也可以是多条SQL语句。
事务具有四个特性
原子性:不可分隔、成则具成、败则具败。
一致性:事务在完成时,必须使所有的数据都保持一致状态
隔离性:独立的执行互不干扰。由并发事务所作的修改必须与任何其他并发事务所作的修改隔离。
持久性:务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。
应用程序主要通过指定事务启动和结束的时间来控制事务。
启动事务:使用 API 函数和 Transact-SQL 语句,可以按显式、自动提交或隐式的方式来启动事务。
结束事务:您可以使用 COMMIT(成功) 或 ROLLBACK(失败) 语句,或者通过 API 函数来结束事务。
事务模式分为:显示事务模式、隐式事务模式、自动事务模式。在SQL常用的是显示模式。
创建事务的原则:
尽可能使事务保持简短很重要,当事务启动后,数据库管理系统 (DBMS) 必须在事务结束之前保留很多资源、以保证事务的正确安全执行。
特别是在大量并发的系统中, 保持事务简短以减少并发 资源锁定争夺,将先得更为重要。










