数据库系列之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
posted @ 2015-02-08 21:48  cmHunter  阅读(341)  评论(0编辑  收藏  举报