`
jackroomage
  • 浏览: 1217705 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

自己测试用的_存储过程中 SET XACT_ABORT 各种用法及显示结果 回滚

 
阅读更多

-- use  accmain

 

 

-- 删除表和过程
/**
 drop table gk_testa
 drop table gk_testb
 drop procedure sql_pro
**/
-- 创建表
/**
CREATE TABLE  gk_testa(
   id int identity(1,1) PRIMARY KEY,
   username Varchar(200),
   password  Varchar(200)
)

CREATE TABLE  gk_testb(
   id int identity(1,1) PRIMARY KEY,
   username Varchar(200),
   password  int
)
**/

--  删除数据
/**
 delete  from gk_testa
 delete  from gk_testb
**/

-- 1、  总体作为一个事务,整体提交或整体回滚,格式为:
 create procedure sql_pro AS
 SET XACT_ABORT ON
 begin TRAN
 insert into gk_testa(username,password)values('jack','123qwe');
 insert into gk_testb(username,password)values('jack','123qwe');
 COMMIT TRAN

-- 2、 每个语句作为一个事务,事务在错误行终止,错误行回滚,错误行之前的不回滚,格式为:
 create procedure sql_pro AS
 SET XACT_ABORT ON
 begin
 insert into gk_testa(username,password)values('jack','123qwe');
 insert into gk_testb(username,password)values('jack','123qwe');
 end

-- 3、带参数的存储过程(总体作为一个事务,整体提交或整体回滚),格式为:
 create procedure sql_pro (@usernamea Varchar(200), @passworda Varchar(200),@usernameb Varchar(200), @passwordb int)
 AS
 SET XACT_ABORT ON
 begin TRAN
 insert into gk_testa(username,password)values(@usernamea,@passworda);
 insert into gk_testb(username,password)values(@usernameb,@passwordb);
 COMMIT TRAN

--   执行过程(无参数)
exec  sql_pro;
--   执行过程(有参数)
exec  sql_pro 'aname','apassword','bname',222;


--   查询数据
 select * from gk_testa
 select * from gk_testb

 

 

 

================== 上面是sql Server 数据库测写法。

 

 

===================下面是参考的例子(各种数据库应该都支持吧)。

 

 


SET XACT_ABORT各种用法及显示结果
默认行为

  默认为SET XACT_ABORT OFF,没有事务行为。
SET XACT_ABORT ON

  SET XACT_ABORT ON分为两种:

  1、总体作为一个事务,整体提交或整体回滚,格式为:

SET XACT_ABORT ON
BEGIN TRAN
    --要执行的语句
COMMIT TRAN
GO

  2、每个语句作为一个事务,事务在错误行终止,错误行回滚,错误行之前的不回滚,格式为:

SET XACT_ABORT ON
BEGIN
    --要执行的语句
END
GO

测试
复制代码

--创建测试表
use MyDB
CREATE TABLE student
(   
        stuid int NOT NULL PRIMARY KEY,
        stuname varchar(50)
)
CREATE TABLE score
(
        stuid int NOT NULL REFERENCES student(stuid),
        score int
)
GO

--插入测试数据
INSERT INTO student VALUES (101,'zhangsan')
INSERT INTO student VALUES (102,'wangwu')
INSERT INTO student VALUES (103,'lishi')
INSERT INTO student VALUES (104,'maliu')
GO

---------------测试事务提交------------------
use MyDB
--只回滚错误行,语句还继续执行
SET XACT_ABORT OFF
BEGIN TRAN
    INSERT INTO score  VALUES (101,90)
    INSERT INTO score VALUES (102,78)
    INSERT INTO score VALUES (107,76) /* Foreign Key Error */
    INSERT INTO score VALUES (103,81)
    INSERT INTO score VALUES (104,65)
COMMIT TRAN
GO
/*
stuid       score
----------- -----------
101         90
102         78
103         81
104         65

(4 row(s) affected)
*/

use MyDB
--事务终止并全部回滚
SET XACT_ABORT ON
BEGIN TRAN
    INSERT INTO score  VALUES (101,90)
    INSERT INTO score VALUES (102,78)
    INSERT INTO score VALUES (107,76) /* Foreign Key Error */
    INSERT INTO score VALUES (103,81)
    INSERT INTO score VALUES (104,65)
COMMIT TRAN
GO
/*
stuid       score
----------- -----------
(0 row(s) affected)
*/

use MyDB
--事务在错误行终止,错误行回滚,错误行之前的不回滚
SET XACT_ABORT ON
BEGIN
INSERT INTO score  VALUES (101,90)
    INSERT INTO score VALUES (102,78)
    INSERT INTO score VALUES (107,76) /* Foreign Key Error */
    INSERT INTO score VALUES (103,81)
    INSERT INTO score VALUES (104,65)
END
GO
/*
stuid       score
----------- -----------
101         90
102         78
(2 row(s) affected)
*/

 

 

 

 

 

来源:http://www.cnblogs.com/rob0121/articles/2320932.html

分享到:
评论

相关推荐

    SQL事务设置SET XACT_ABORT后正确回滚

     当 SET XACT_ABORT 为 ON 时,如果 Transact-SQL 语句产生运行时错误,整个事务将终止并回滚。为 OFF 时,只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。编译错误(如语法错误)不受 SET XACT_...

    在存储过程中编写正确的事务处理代码(SQL_Server_2000_.doc

    1. **启用XACT_ABORT**:通过在事务开始前使用`SET XACT_ABORT ON`,可以确保在遇到错误时,整个事务会被回滚,而不是仅回滚出错的语句。这可以防止意外的后续操作。 ```sql SET XACT_ABORT ON; BEGIN TRAN UPDATE...

    SQL2000 事务回滚问题探讨

    总结来说,SQL2000中的事务回滚问题关键在于理解和有效利用`SET XACT_ABORT`选项来控制错误处理策略,以及在错误发生时及时回滚事务并提供适当的错误反馈。在编写涉及事务处理的存储过程或脚本时,确保正确处理错误...

    存储过程的几个小例子

    在数据库管理中,存储过程(Stored Procedure)是一种预编译的SQL代码集合,它封装了特定的功能,并且可以在需要时通过调用其名称来执行。存储过程是数据库系统中的一个重要特性,尤其对于复杂的业务逻辑处理和提高...

    第八次作业1

    但在本题中,使用了`SET XACT_ABORT ON`命令,这意味着如果在事务中发生错误,整个事务会被立即终止,并自动回滚,而不是只回滚到错误发生时的状态。因此,当`T4`中的插入操作因主键冲突失败时,由于`XACT_ABORT`...

    SQL Server 跨库同步数据

    否则,如果在执行过程中遇到错误,由于`SET XACT_ABORT ON`设置,事务将被自动回滚,防止不完整或不一致的数据被写入目标表。 在实际应用中,这种跨库同步数据的方法可能会结合SQL Server代理作业定期执行,以实现...

    SQL Server存储过程中编写事务处理的方法小结

    当设置`SET XACT_ABORT ON`时,如果在事务中的任何语句出现错误,SQL Server将自动回滚整个事务,并终止执行。这有助于避免因错误导致的部分事务提交。例如: ```sql SET XACT_ABORT ON; BEGIN TRAN UPDATE ...

    Sqlserver 存储过程中结合事务的代码

    在SQL Server中,存储过程是预编译的SQL语句集合,它们封装在一起,以便重复使用和方便管理。而事务则是数据库操作的基本单位,用于确保一组数据库操作要么全部成功,要么全部失败,以维护数据的一致性和完整性。当...

    浅析SQL存储过程和事务处理

    在这个存储过程中,`BEGIN TRAN`启动了一个新的事务,`SET XACT_ABORT ON`设置了一个选项,使得一旦发生任何错误,事务将自动回滚,避免了脏数据的产生。接着,尝试插入新用户数据到USER表中。如果`@@error`返回值不...

    浅析SQL Server中包含事务的存储过程

    在存储过程中使用事务,可以提供高级别的数据保护,确保在处理大量或复杂的数据更改时,即使出现错误也能保持数据的正确状态。 首先,让我们深入理解存储过程中的事务管理。存储过程是预编译的SQL代码集合,可作为...

    SQL SERVER事务处理详解.doc

    `SET XACT_ABORT`是一个非常有用的设置,它决定了当Transact-SQL语句遇到运行时错误时,是否自动回滚整个事务。如果设置为ON,任何错误都会导致事务回滚,这对于确保数据一致性非常有用,特别是在存储过程中。 例如...

    MS DTC配置,ATL,COM

    在开始事务的语句前添加`set xact_abort ON`,这可以确保在大多数OLE DB提供程序(包括SQL Server)中,即使发生错误,事务也会被回滚,避免数据不一致。 #### 5. MSDTC安全配置 在“组件服务”中,找到“我的电脑...

    sql server 事务处理

    6. **SET XACT_ABORT ON/OFF**:设置此选项可以控制当语句引发错误时事务的行为。默认情况下,ON会回滚整个事务,OFF则只影响引发错误的语句。 7. **事务隔离级别设置**:如`SET TRANSACTION ISOLATION LEVEL`命令...

    SQL Server 2005新功能-TSQL的描述

    SET XACT_ABORT ON选项可以开启事务的自动回滚,确保在发生错误时事务得到正确处理。 5. **公用表表达式(Common Table Expressions, CTE)**: CTE提供了一种创建临时结果集的方式,而无需使用临时表或视图。它们...

    SQL 添加触发器

    - `SET XACT_ABORT ON`:设置事务异常选项,如果事务中的任何语句失败,则整个事务将回滚。 3. **条件检查**: - `IF EXISTS (SELECT 1 FROM inserted) AND NOT EXISTS (SELECT 1 FROM deleted)`:检查是否有行被...

    数据库实验性索引触发器.doc

    但通过设置`SET XACT_ABORT ON`,可以确保任何错误都会导致整个事务回滚。 2. **事务处理与批处理的区别**:事务处理关注的是操作的一致性,而批处理则是一次执行多个SQL语句。在批处理中,即使有语句失败,其他成功...

    sqlserver2000基础(高手也有用)

    15.4.4 XACT_ABORT与RAISERROR的疑难解答 477 15.5 游标处理疑难解答 479 15.5.1 全局游标与本地游标 479 15.5.2 检查指定的游标是否存在 480 15.5.3 事务提交或者回滚对游标的影响 482 15.5.4 可更新的...

Global site tag (gtag.js) - Google Analytics