zoukankan      html  css  js  c++  java
  • SQL事务--转载

    转自:https://www.cnblogs.com/yuan-jun/p/6505759.html#_labelTop

    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
     
  • 相关阅读:
    Codeforces训练记录
    2017中国大学生程序设计竞赛-杭州站
    Codeforces Round #636 (Div. 3)
    自适应Simpson积分
    2020牛客暑期多校训练营(第九场)- E. Groundhog Chasing Death
    2020 Multi-University Training Contest 6
    拉格朗日插值法学习笔记
    二次剩余学习笔记
    2020 Multi-University Training Contest 3
    2020 Multi-University Training Contest 2
  • 原文地址:https://www.cnblogs.com/niudieyi/p/9388845.html
Copyright © 2011-2022 走看看