zoukankan      html  css  js  c++  java
  • 数据库系列之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
  • 相关阅读:
    php常用函数
    检测到有潜在危险的 Request.Form 值
    未能加载文件或程序集“XXX”或它的一个依赖项,试图加载格式不正确的程序
    尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题
    java基础知识
    .net中excel遇到的一些问题
    easyui验证
    .NET牛人需要了解的问题[转]
    关于easyui遇到的一些问题
    MVC 路由介绍
  • 原文地址:https://www.cnblogs.com/cmhunter/p/4280536.html
Copyright © 2011-2022 走看看