数据库系列之T-SQL(事务)
什么是事务?
事务是一个不可分割的操作,要么全部执行,要么全部不执行
事务有什么用?
保证一个业务的完整执行。
怎么用事务?
3.1 事务的分类
显示事务:用BEGIN TRANSACTION明确指定事务的开始,这是最常用的事务类型。
隐性事务:通过设置SET IMPLICIT_TRANSACTIONS ON 语句,将隐性事务模式设置为打开,下一个语句自动启动一个新事务。当该事务完成时,再下一个 T-SQL 语句又将启动一个新事务。
自动提交事务:这是 SQL Server 的默认模式,它将每条单独的 T-SQL 语句视为一个事务,如果成功执行,则自动提交;如果错误,则自动回滚。
3.2 T-SQL使用下列语句来管理事务
开始事务:BEGIN TRANSACTION
提交事务:COMMIT TRANSACTION
回滚事务:ROLLBACK TRANSACTION
一旦事务提交或回滚,则事务结束。
3.3 讲解管理事务的三种操作语句
判断T-SQL语句是否有错,将使用到我们曾讲过的全局变量@@error,
它只能判断当前条T-SQL语句执行是否有错(有错返回非零值 ),而事务包含很多步操作,所以我们一般需要累计错误,表明整个事务是否有错误发生。
USE [TestDB] GO /****** Object: StoredProcedure [dbo].[P_UpdateBaseInfo] Script Date: 02/25/2015 14:38:19 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- Description: 基础资料更新的存储过程 -- 事务和异常的执行方式 ALTER PROCEDURE [dbo].[P_UpdateBaseInfo] @ServerIP nvarchar(4000), @ReturnMsg nvarchar(200) output AS set @ReturnMsg = '' begin try --异常处理 begin Tran --开启事务 delete from dbo.T_User Commit Tran --提交事务 set @ReturnMsg = '更新成功' end try begin catch rollback tran --事务回滚 set @ReturnMsg = @ReturnMsg + '更新失败, 原因:' + ERROR_MESSAGE() end catch
/*--关键语句讲解--*/ BEGIN TRANSACTION /*--定义变量,用于累计事务执行过程中的错误--*/ DECLARE @errorSum INT SET @errorSum=0 --初始化为0,即无错误 /*--转账:张三的账户少1000元,李四的账户多1000元*/ UPDATE bank SET currentMoney=currentMoney-1000 WHERE customerName='张三' SET @errorSum=@errorSum+@@error UPDATE bank SET currentMoney=currentMoney+1000 WHERE customerName='李四' SET @errorSum=@errorSum+@@error --累计是否有错误 IF @errorSum<>0 --如果有错误 BEGIN print '交易失败,回滚事务' ROLLBACK TRANSACTION END ELSE BEGIN print '交易成功,提交事务,写入硬盘,永久的保存' COMMIT TRANSACTION END GO print '查看转账事务后的余额' SELECT * FROM bank GO
declare @errorcount int begin tran set @errorcount = 0 Insert into dbo.T_Customer( ID,Name,Age ) Values( 1,1,'1' ) set @errorcount = @errorcount + @@error update T_User set name = null where id = 2 set @errorcount = @errorcount + @@error if @errorcount!=0 begin print convert(nvarchar(50),@errorcount) + '回滚' rollback end else begin print convert(nvarchar(50),@errorcount) + '提交' commit end go