none
xact_abort存在的意义是什么 RRS feed

  • 问题

  • xact_abort存在的意义是什么?是为了破幻事务的“原子性”?

    因为xact_abort设置为off,事务中某些语句的执行失败并不影响其他语句的继续执行,而且SQL Server默认将xact_abort设置为off。我现在正好碰到这个问题,还导致了异常数据发生。

    微软是怎么考虑的呢?


    chenl

    2016年3月29日 12:43

全部回复

  • (2)设置连接属性
    SET XACT_ABORT ON
    当为ON时,如果执行TSQL语句产生运行错误,则整个事务将终止并回滚
    当为OFF时,处理方法是不唯一的。有时只回滚TSQL语句,而事务继续进行
    如果错误很严重,即使SET XACT_ABORT 为OFF,也会回滚整个事务
    OFF是默认值
    如果没有办法很快规范应用程序的错误捕捉和处理语句,一个最快的方法就是在每个连接建立以后
    或者是最容易出问题的存储过程的开头,运行SET XACT_ABORT ON,让SQL帮助应用程序回滚事务

    应该是一致性,不是原子性


    Love SQL

    2016年3月30日 1:51
  • 恩,:要么全部回滚,要么全部不回滚,这是原子性的要求。

    对一个事务而言,我们都知道应该要这样。

    为何不统一SET XACT_ABORT为ON。设置OFF反而会引起一些问题,而且这个还是默认设置,很容易让开发人员忽略了。


    chenl

    2016年3月30日 3:42
  • 基本上你只有在SSMS里面才能达到这个默认效果。

    大部分程序里面自动就设置为ON了。


    想不想时已是想,不如不想都不想。

    2016年3月30日 4:29
    版主
  • SQL作业里面也会遇到这个问题。

    chenl

    2016年3月30日 5:09
  • SQL作业里面也会遇到这个问题。

    chenl


    这倒是。

    想不想时已是想,不如不想都不想。

    2016年3月30日 6:33
    版主
  • 但是,这个没影响原子性。因为语句执行失败,前端是有反馈的。

    另外,桦仔又没搞清楚一致性和原子性的含义。回去复习一下基础知识吧。


    想不想时已是想,不如不想都不想。

    2016年3月30日 6:47
    版主
  • 为 ON 看起来比较符合一般性思维,出错了处理就终止了,而且后面的不继续,有开事务的话,事务也回滚(没开事务就没办法了,已经成功做过的不会回滚),而且有利于避免处理逻辑不完善导致处理失败有挂起事务的情况

    为OFF则有利于自己控制,比如在事务处理中,有的错误是希望忽略或者其他处理,并不是一定要回滚事务的

    2016年3月30日 7:40

  • 针对同一个事务是原子性

    我一直在复习的


    Love SQL


    2016年3月30日 8:40
  • 不知道楼主用的是显式提交还是隐式提交,不知道你有没有用go

    下面的几种情况测试一下吧

    USE [test]


    BEGIN TRAN
    SELECT * FROM [dbo].[出货单]
    UPDATE [dbo].[出货单] SET [费用2]='tt' WHERE [orderno]=65668989898989898989898989898988989898989

    UPDATE [dbo].[费用单] SET [orderno]=88 WHERE [费用类型]='停车费'

    COMMIT

    消息 1007,级别 15,状态 1,第 6 行
    数字 '65668989898989898989898989898988989898989' 超出了数值表示范围(最大精度为 38)。

    BEGIN TRAN

    UPDATE [dbo].[出货单] SET [费用2]='tt' WHERE [orderno]=65668989898989898989898989898988989898989
    go
    UPDATE [dbo].[费用单] SET [orderno]=99 WHERE [费用类型]='停车费'

    go

    COMMIT TRAN

    BEGIN TRAN

    UPDATE [dbo].[出货单] SET [费用2]='tt' WHERE [orderno]=65668989898989898989898989898988989898989

    UPDATE [dbo].[费用单] SET [orderno]=99 WHERE [费用类型]='停车费'


    COMMIT TRAN


    Love SQL

    2016年3月30日 8:59

  • 针对同一个事务是原子性

    我一直在复习的


    Love SQL



    原子性和一致性都是同一个事务啊。一致性指的是一份数据的不同地方,比如索引。

    想不想时已是想,不如不想都不想。

    2016年3月30日 13:19
    版主
  • 桦仔别捣乱了,XACT_ABORT的用途很清楚的,跟隐式提交和GO没影响。

    想不想时已是想,不如不想都不想。

    2016年3月30日 13:25
    版主
  • 你说没有影响原子性应该是说前端程序控制了事务。

    我这个问题的背景就是一个SQL job里面执行了一个事务,但事务中部分语句报错了,其他语句则正常执行了由所以从这个角度来看,应该是影响了原子性的。


    chenl

    2016年3月31日 7:57
  • 有道理。

    我还是认为数据库默认采用off有点坑啊,一个不留神就可能忽略了。相反如果默认设置为On,我到觉得可以接受。


    chenl


    • 已编辑 i6first 2016年3月31日 9:49
    2016年3月31日 7:59
  • 用法习惯问题,用一门语言就必须遵守它的语法规则,SQL SERVER一直以来的版本都是这样用

    同时多段操作DML变更数据时,批次执行语句必须要封装为一个事务

    xact_abort自身不能指定自定义错误信息,通常用分布式事务或处理数据时会用到

    如果是批次处理数据可尝试用以下方法(看联机用法)

    SET IMPLICIT_TRANSACTIONS ON--将连接设置为隐式事务模式。

    --指定提交或回滚


    Roy Wu(吳熹Blog)(微博)

    2016年4月7日 10:11
    版主
  • 恩恩,多谢。

    chenl

    2016年4月8日 8:13
  • C#客户端连接数据库时,就是设置为on的,而数据库本身设置为off,当你使用存储过程时就要小心了
    2016年5月3日 6:02