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
  • 相关阅读:
    Flsak中的socket是基于werkzeug实现的。
    Flask中的CBV
    beego——静态文件
    beego——模板函数
    beego——模板处理
    beego——模板语法
    beego——模型定义
    beego——事务处理和命令模式
    beego——构造查询
    beego——原生SQL查询
  • 原文地址:https://www.cnblogs.com/yuan-jun/p/6505759.html
Copyright © 2011-2022 走看看