zoukankan      html  css  js  c++  java
  • SQL 事务(Transaction)

    1、概念

    指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)由多个sql语句组成,必须作为一个整体执行
    这些sql语句作为一个整体一起向系统提交,要么都执行、要么都不执行

    语法步骤:
    开始事务:BEGIN TRANSACTION --开启事务
    事务提交:COMMIT TRANSACTION --提交操作
    事务回滚:ROLLBACK TRANSACTION --取消操作

    2、建表

    --建表
    CREATE TABLE [Person](
    [PersonId]    NVARCHAR(100) PRIMARY KEY ,        ---主键
    [PersonName] NVARCHAR(100) NULL
    )

    3、事务

    /*
        如果只有Begin TransAction和Commit TransAction 就算报错了,也是不会回滚的
        Select * From Person
    */
    Begin TransAction
            Insert Into Person(PersonId,PersonName)Values('1','Name1')
            Insert Into Person(PersonId,PersonName)Values('1','Name1')
            Insert Into Person(PersonId,PersonName)Values('3','Name3')
    Commit TransAction
    
    /*
        如果只有Begin TransAction和RollBack TransAction 就算没报错了,还是会回滚的
        Select * From Person
    */
    --清除数据
    Delete Person
    Begin TransAction
            Insert Into Person(PersonId,PersonName)Values('1','Name1')
            Insert Into Person(PersonId,PersonName)Values('1','Name1')
            Insert Into Person(PersonId,PersonName)Values('3','Name3')
    RollBack TransAction
    
    /*
        SET XACT_ABORT ON时,在事务中,若出现错误,系统即默认回滚事务,但只对非自定义错误有效
        SET XACT_ABORT OFF,默认值,在事务中,回滚一个语句还是整个事务视错误的严重程序而定,
        用户级错误一般不会回滚整个事务
        
        Select * From Person
    */
    SET XACT_ABORT ON -- 打开
    Begin TransAction
            Insert Into Person(PersonId,PersonName)Values('1','Name1')
            Insert Into Person(PersonId,PersonName)Values('1','Name1')
            Insert Into Person(PersonId,PersonName)Values('3','Name3')
    Commit TransAction
    SET XACT_ABORT OFF -- 关闭
    
    /*
        Try Catch 配合事务使用    
        Select * From Person
    */
    Begin Try
        Begin TransAction
            Insert Into Person(PersonId,PersonName)Values('1','Name1')
            Insert Into Person(PersonId,PersonName)Values('1','Name1')
            Insert Into Person(PersonId,PersonName)Values('3','Name3')
        Commit TransAction
    End Try
    Begin Catch
        Rollback TransAction
    End Catch
    
    /*
        使用全局变量@@Error 配合事务使用    
        Select * From Person
    */
    DECLARE @tran_error int;
    SET @tran_error = 0;
        Begin TransAction
            Insert Into Person(PersonId,PersonName)Values('1','Name1')
            SET @tran_error = @tran_error + @@ERROR;
            print(@tran_error);
            Insert Into Person(PersonId,PersonName)Values('1','Name1')
            SET @tran_error = @tran_error + @@ERROR;
            print(@tran_error);
            Insert Into Person(PersonId,PersonName)Values('3','Name3')
            SET @tran_error = @tran_error + @@ERROR;
            print(@tran_error);
    IF(@tran_error > 0)
        BEGIN
            --执行出错,回滚事务
            ROLLBACK TransAction;
        END
    ELSE
        BEGIN
            --没有异常,提交事务
            COMMIT TransAction;
        END
  • 相关阅读:
    剑指offer-二维数组中的查找 java实现
    Matlab2015b激活失效解决办法
    解决ueditor在多图上传的时候偶尔抽风,图片丢失或者乱序
    用.net正则去除所有的html源码或者提取出图片地址以及存数据库时的符号替换(如富文本编辑器)
    DropDownList的动态绑定方法(两种)
    Ueditor使用说明(包括设置其可编辑不可编辑)
    用webuploader上传图片并预览(上传文件)
    .net日期控件(全.net)
    代码注释
    面向对象的概念
  • 原文地址:https://www.cnblogs.com/yuan-jun/p/6505759.html
Copyright © 2011-2022 走看看