sql 关于dblink和多条update、insert事务回滚写法

在存储过程的编写中难免会遇到调用同库他人的proc和跨库调用proc,还有一个proc中有多条对多表进行写入和修改的语句。那么就会用到tran。

如果我们在不写try的情况下就要对每个insert,update的后面写上

IF @@error <> 0
                OR @@Rowcount = 0
                BEGIN
                    ROLLBACK TRAN
                END    

来确保所有语句的正常执行和有影响的行数。

而在写了try的情况下,我们就可规范一下写法,利用RAISERROR

DECLARE @Ret_Msg VARCHAR(200)
DECLARE @Ret_Msg1 VARCHAR(200)
DECLARE @nResult INT
DECLARE @vcResult VARCHAR(200)
BEGIN TRY
        BEGIN TRAN
               UPDATE Table_a set a=1 WHERE b =1
               IF @@Rowcount = 0
               BEGIN
                    SET @Ret_Msg = ‘执行失败‘
                    SET @Ret_Msg1 = ‘Table_a 更新失败‘
                    RAISERROR(@Ret_Msg1,16,1)
               END
               数据库.架构.proc 1,2, @nResult OUT, @vcResult OUT
               IF @nResult <0
               BEGIN
                    SET @Ret_Msg = @vcResult
                    SET @Ret_Msg1 = ‘dbLink调用失败‘ + @vcResult
                    RAISERROR(@Ret_Msg1,16,1)
               END
               SELECT @Ret_Msg  as vcResult
        COMMIT TRAN
END TRY
BEGIN CATCH
    IF @@tranCount > 0
                ROLLBACK TRAN;
    SELECT  @Ret_Msg AS vcResult
END CATCH             

当结果不是我们想要的就RAISERROR抛个错误,让CATCH处理

时间: 2024-09-29 11:09:55

sql 关于dblink和多条update、insert事务回滚写法的相关文章

SQL Server事务回滚对自增键的影响

SQL Server事务回滚时是删除原先插入导致的自增值,也就是回滚之前你你插入一条数据导致自增键加1,回滚之后还是加1的状态 --如果获取当前操作最后插入的identity列的值:select @@IDENTITY--如果要获取某表的最后的identity列的值:select IDENT_CURRENT('表名') --如果要模拟抛出异常可以用RAISERROR --RAISERROR('错误的描述',错误的严重级别代码,错误的标识,错误的描述中的参数的值(这个可以是多个),一些其它参数) -

SQL的事务回滚操作带案例分析

SET XACT_ABORT on BEGIN TRAN INSERT INTO [PDA_Action] VALUES ('采购入库1') INSERT INTO [PDA_Action] VALUES ('采购入库2') SELECT 1/0  /* 除数为0错误 */ INSERT INTO [PDA_Action] VALUES ('采购入库3') INSERT INTO [PDA_Action] VALUES ('采购入库4') COMMIT TRAN 对于有select的语句的回滚,

SQL事务回滚样例

选课系统,当同意学号选课数量超过则回滚事务,符合条件则正常插入数据 --开始一个事务处理Begin Tran T1 --执行插入操作insert into Courselist values('20100021','01');insert into Courselist values('20100021','02');insert into Courselist values('20100021','03');insert into Courselist values('20100021','0

sql事务(Transaction)用法介绍及回滚实例

事务是将一系列操作作为一个单元执行,要么成功,要么失败,回滚到最初状态.在事务处理术语中,事务要么提交,要么中止.若要提交事务,所有参与者都必须保证对数据的任何更改是永久的.不论系统崩溃或是发生其他无法预料的事件,更改都必须是持久的.只要有一个参与者无法做出此保证,整个事务就会失败.事务范围内的所有数据更改将回滚到特定设置点. Begin TRANSACTION 语句1; If @@error<>0 Goto error 语句2; If @@error<>0 Goto error

sql事务(Transaction)用法介绍及回滚实例_转

sql事务(Transaction)用法介绍及回滚实例 事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性 当对多个表进行更新的时候,某条执行失败.为了保持数据的完整性,需要使用事务回滚. 显示设置事务 代码如下 begin try   www.2cto.com begin transaction insert into shi

【转】mysql触发器的实战(触发器执行失败,sql会回滚吗)

1   引言 Mysql的触发器和存储过程一样,都是嵌入到mysql的一段程序.触发器是mysql5新增的功能,目前线上凤巢系统.北斗系统以及哥伦布系统使用的数据库均是mysql5.0.45版本,很多程序比如fc-star管理端,sfrd(das),dorado都会用到触发器程序,实现对于数据库增.删.改引起事件的关联操作.本文介绍了触发器的类型和基本使用方法,讲述了触发器使用中容易产生的误区,从mysql源码中得到触发器执行顺序的结论,本文最后是实战遭遇的触发器经典案例.没有特殊说明时,本文的

DDL, DML不是所有SQL都是可以自动回滚的

因为DDL没有事务性,所以DDL不能回滚. 要实现自动回滚.(begin,commit,rollback),则SQL语句中只能包括DML. 这样,自动化发布就会受限规范格式. 故而,一刀切的办法是,假定所有SQL不支持事务,自已定义好ROLLBACK的SQL脚本,在出错时能用代码回滚, 而不是依赖于数据库本身的功能. ======================== DDL和DML DDL (Data Definition Language 数据定义语言) create table 创建表 al

程序中使用事务来管理sql语句的执行,执行失败时,可以达到回滚的要求。

1.设置使用事务的SQL执行语句 1 /// <summary> 2 /// 使用有事务的SQL语句 3 /// </summary> 4 /// <param name="sql"></param> 5 /// <param name="conn"></param> 6 /// <param name="tran"></param> 7 /// &l

sql回滚

rollback是针对事务的,你如果没有在执行语句之前开启事务,那么无法rollback,建议你还是想别的办法吧,事务语句如下(sqlserver的给你借鉴):--开启事务begin tran --执行操作update Accounts_UsersExp set TelPhone=123456 where userid=14--执行错误事务回滚rollback--如果正确进行事务提交commit可以勾选一句执行一句,但是commit了就不能rollback