首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当xact_abort打开时,为什么Sql Server在raiserror之后继续执行?

当xact_abort设置为ON时,如果在SQL Server中执行RAISERROR,即使是一个警告级别的错误,也会立即中止当前的批处理,并将事务标记为未提交。这是因为xact_abort的设计目的就是确保在出现错误时立即停止事务,以防止进一步的数据损坏。

然而,在某些情况下,即使出现错误,您可能仍然希望事务继续执行。在这种情况下,您可以考虑将xact_abort设置为OFF。这将允许事务在遇到错误时继续执行,但请注意,这可能会导致数据损坏或不一致。

如果您希望在出现错误时仍然能够执行事务,但同时还希望记录错误信息,则可以考虑使用TRY...CATCH块来捕获错误并处理它们。这样,您可以在事务中的单个语句出现错误时记录错误信息,并允许事务继续执行。

总之,如果您希望在出现错误时中止事务,请确保xact_abort设置为ON。如果您希望在出现错误时继续执行事务,请将xact_abort设置为OFF,并谨慎使用TRY...CATCH块来处理错误。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

SQL SERVER事务处理

SET XACT_ABORT 的设置是在执行或运行时设置,而不是在分析时设置。 示例 下例导致在含有其它 Transact-SQL 语句的事务中发生违反外键错误。...触发器继续执行 ROLLBACK 语句之后的所有其余语句。如果这些语句中的任意语句修改数据,则不回滚这些修改。执行其余的语句不会激发嵌套触发器。在批处理中,不执行所有位于激发触发器的语句之后的语句。...在为连接将隐性事务模式设置为打开之后,当 SQL Server 首次执行下列任何语句时,都会自动启动一个事务: ALTER TABLE INSERT CREATE OPEN DELETE REVOKE...在第一个事务被提交或回滚之后,下次当连接执行这些语句 中的任何语句时,SQL Server 都将自动启动一个新事务。...事实上,任何在回滚之前执行的语句都没有在错误发生时回滚。这语句仅当外层的事务回滚时才会进行回滚。 例:内部事务回滚SQL server 报错。

1.8K20

sql server 无法访问数据库

今天说一说sql server 无法访问数据库[system error],希望能够帮助大家进步!!!...在SQL Server中,我常常会看到有些前辈这样写: if(@@error0) ROLLBACK TRANSACTION T else COMMIT TRANSACTION T 一开始...所以,像上面这种写法是不妥的,举个例子,如下: 此代码由Java架构师必看网-架构君整理 SET NOCOUNT ON; SET XACT_ABORT ON; --执行 Transact-SQL 语句产生运行时错误...因为执行RAISERROR语句时,@@error的值不为0(好像是5000),而当执行到下一句"SELECT GETDATE()"时,@@error的值又变为0了!...用Try...CATCH语法就可以了,语句如下: SET NOCOUNT ON; SET XACT_ABORT ON; --执行 Transact-SQL 语句产生运行时错误,则整个事务将终止并回滚

1.6K50
  • sql事务的使用及其技巧整理

    但是,我们平时在开发过程过程中,说的事务:其实是指的一组有序的SQL集合,通过事务确保这一组SQL集合执行结果的一致性。...隐式事务:使用Set IMPLICIT_TRANSACTIONS ON 将隐式事务模式打开,sql执行完毕自动提交,当一个事务结束,这个模式会自动启用下一个事务,只用Commit Transaction...---- XACT_ABORT 设置 on :代表某一个语句执行错误,都不在继续往下执行,并自动回滚事务 ---- XACT_ABORT 设置 off :代表某一个语句执行错误,子回滚该条语句执行,并继续执行后续语句...values(12,12) commit tran 设置事务保存点:  在平时的事务使用过程中,还有可能需要实现,事务回滚时,只回滚到指定位置,指定位置之前的执行结果不在回滚   在sqlserver...简单的总结:实际上执行的每一个sql都是采用事务来实现的,在实际使用中,我们一般采用显示事务来处理业务,但是在事务的使用过程中一定要结合对应的策略来确保事务执行结果的一致性。

    1K20

    SQL基础【十八、事物】(sql事物慎用,还是写业务逻辑代码好一些,入伙涉及到更换数据啥的很麻烦!)

    I 隔离性:并发多个事务时,一个事务的执行不受其他事务的影响。 D 持久性:事务提交之后,数据是永久性的,不可再回滚,不受关机等事件的影响。...然而在SQL Server中事务被分为3类常见的事务: 自动提交事务:是SQL Server默认的一种事务模式,每条Sql语句都被看成一个事务进行处理,你应该没有见过,一条Update 修改2个字段的语句...事务保存点示例: 在SQL Server中使用rollback会回滚所有的未提交事务状态,但是有些时候我们只需要回滚部分语句,把不需要回滚的语句提到事务外面来,虽然是个方法,但是却破坏了事务的ACID。...使用场景:当操作数据时前校验数据成本太高且数据出错率不高时 可采用.eg:用户下单 检查库存信息是否>0时 可以设置库存量需>=0的约束 当更新库时信息小于0即出错 进行事务回滚 并查询返回当前库存信息...4、使用set xact_abort 设置 xact_abort on/off , 指定是否回滚当前事务,为on时如果当前sql出错,回滚整个事务,为off时如果sql出错回滚当前sql语句,其它语句照常运行读写数据库

    48020

    谈谈基于SQL Server 的Exception Handling

    我们知道在.NET Application中,如果出现一个未处理的Exception,程序将立即终止,后续的程序将不会执行,但是对于上面的SQL则不一样,虽然我们通过RAISERROR将Error抛出,...Exception的地方添加了RETURN,从而防止了后续的程序继续执行,但是对于一些我们无法预知的Exception呢?...我想有人会说在每条语句执行之后都通过@@ERROR判断是否有Exception出现,我知道很多人喜欢这么做,而事实上,我现在真在维护的一些Stored procedure就是这么做的:全篇都是IF@@ERROR...在SQL Server中我们通过BEGIN TRY/END TRY和BEGIN CATCH/END CATCH这样的结构来进行Exception Handling。...(@error_message,@error_serverity,@error_state)         END CATCh 当执行上面一个SQL的时候,碰到任何一个我们自己抛出的Exception

    88970

    绕过SQL Server的登录触发器限制

    与 SQL Server实例建立用户会话时将引发此事件。 登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。...我的回答是通常是在你从配置文件或反编译代码恢复连接字符串之后使用,现在我们希望使用该信息直接连接到后端SQL Server,这是应用程序渗透测试中非常常见的情况。...某些应用程序的名称已经在连接SQL Server的连接字符串中静态设置。与主机名类似,我们可以在配置文件和源码中找到它们。...默认情况下,当使用.NET以编程方式连接到SQL Server时,“appname”属性将设置为“.Net SqlClient Data Provider”。...考虑根据用户组和访问权限来限制对SQL Server的访问,而不是使用登录触发器。 在本文中,我介绍了一些鲜为人知的利用连接字符串属性来绕过SQL Server登录触发器强制执行的访问限制的方法。

    2.1K10

    谈谈基于SQL Server 的Exception Handlingp

    中使用RAISERROR将一个可预知的Error抛出;如何在Stored procedure中使用TRY/CATCH进行异常的捕捉;在Application如果处理从SQL Server抛出的Exception...实际上,SQL Server database Engine抛出、被我们的.NET最终捕获的SqlException,我们通过SqlException的属性可以得到Error的相关信息。...我们来写一个Sample,我们沿用Create User的例子: 在stored procedure中,遇到重名通过RAISERROR抛出异常[在整篇文章中,使用到Error和Exception,大家可以看成是等效的...(@error_message, @error_serverity,@error_state) 将会得到这样的结果: 还有一点需要特别提醒得是,我们可以在调用RAISERROR加了一个WITH...要做到这点很简单,只需要用到SqlConnection的InfoMessage事件,当通过DbCommand执行上面一段Sql的时候,Print语句的执行将出发该事件。

    33310

    谈谈基于SQL Server 的Exception Handling

    比如下面的一个例子:我在SQL Server Management Studio中执行下面一段简单的SQL: DECLARE @result INT SET @result = 10/0 PRINT @...SQL Server Management Studio中执行任何一个语句的时候,如果遇到一个预定义的Error,会打印出相关的Error Message。...对于@@ERROR,有一点需要特别提醒的是:它仅仅代表前一个语句执行的Error Number,之后任何一段语句的执行都会改变@@ERROR的值,甚至是一个IF语句。...一般地,0-10为严重程度很低的错误,11-18来高级别的错误,19-25代表非常严重的错误,以致在执行完成之后会终止当前的Session。...在这里也一样,在message中你一可以添加站位符,这着站位符由Argument来填充,具体如何定义,可以参阅SQL Server 2005 Books Online.

    94860

    SQL SERVER 的压缩功能

    SQL SERVER 2008 及以上提供数据库表压缩功能 1....2.对性能影响   压缩后对磁盘的压力会减少,但是会增加CPU的压力,对性能的影响需要看机器的具体配置,在实际中情况中,经常是CPU没满但是磁盘已满负荷了。...对备份恢复等极为有利,一个大数据库,全备份常常要3-4小时,压缩后,全备时间缩减到2小时。 以下代码生成全库的压缩脚本,注意只是生成脚本,将生成的脚本贴到SQL执行窗口中执行即可。.../*SQL Server 2008 以上,自动进行表压缩 直接运行生成的脚本文件即可 */ SET NOCOUNT ON CREATE TABLE #Temp ( table_name NVARCHAR...Info_cursor DEALLOCATE Info_cursor DROP TABLE #Temp DROP TABLE #tablespaceinfo 生成的脚本类似如下,直接黏贴到窗口中执行即可

    59910

    SQL 事务(Transaction)「建议收藏」

    1、概念 指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)由多个sql语句组成,必须作为一个整体执行 这些sql语句作为一个整体一起向系统提交,要么都执行、要么都不执行 语法步骤: 开始事务...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...,'Name1') Insert Into Person(PersonId,PersonName)Values('3','Name3') Commit TransAction SET XACT_ABORT

    45110

    SQL Server 存储过程

    Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用。当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的性能。...由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的SQL语句块要快。...1、 存储过程的优点 A、 存储过程允许标准组件式编程 存储过程创建后可以在程序中被多次调用执行,而不必重新编写该存储过程的SQL语句。...因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划。...当使用msg_id引发使用sp_addmessage创建的用户定义消息时,raiserror上指定严重性将覆盖sp_addmessage中定义的严重性。

    1.4K50

    SQL Server 存储过程

    Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用。当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的性能。...由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的SQL语句块要快。...1、 存储过程的优点         A、 存储过程允许标准组件式编程         存储过程创建后可以在程序中被多次调用执行,而不必重新编写该存储过程的SQL语句。...因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划。...当使用msg_id引发使用sp_addmessage创建的用户定义消息时,raiserror上指定严重性将覆盖sp_addmessage中定义的严重性。

    1.8K90

    sql 存储过程

    ---- Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用。当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。...由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的SQL语句块要快。...存储过程的优点 1、存储过程允许标准组件式编程 存储过程创建后可以在程序中被多次调用执行,而不必重新编写该存储过程的SQL语句。...因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划。而批处理的T-SQL语句每次运行都需要预编译和优化,所以速度就要慢一些。...当使用msg_id引发使用sp_addmessage创建的用户定义消息时,raiserror上指定严重性将覆盖sp_addmessage中定义的严重性。 任何用户可以指定0-18直接的严重级别。

    1.4K20

    SQL Server 2012学习笔记 (二) ----- SQL Server Transact-SQL

    (5)RAISERROR命令:用于在SQL Server系统中返回错误信息时同时返回用户指定的信息。   ...(10)SET命令:用于给局部变量赋值和用于执行SQL命令时SQL Server的处理选项设定。   (11)SHUTDOWN命令:用于立即停止SQL Server的执行。   ...在打开了隐式事务的设置开关时,执行下一条语句时自动启动一个新事务,并且每关闭一个事务时,执行下一条语句又会启动一个新事务,直到关闭了隐式事务的设置开关。...使用事务:   1)开始事务   当一个数据库连接启动事务时,在该连接上执行的所有Transact-SQL语句都是事务的一部分,直到事务结束。开始事务使用BEGIN TRANSACTION语句。   ...2)结束事务   当一个事务执行完成之后,要将其结束,以便释放所占用的内存资源,结束事务使用COMMIT语句。

    2.6K30

    SQLServer 触发器

    SQL Server 触发器 by:授客 QQ:1033553122 什么是触发器 1.触发器是对表进行插入、更新、删除操作时自动执行的存储过程 2.触发器通常用于强制业务规则 3.触发器是一种高级约束...,可以定义比check等约束更为复杂的约束 可执行复杂的sql语句(if/while/case) 可引用其它表中的列 4.触发器定义在特定的表上,与表相关 5.自动触发执行,不能直接调用 6....是一个事务(可回滚,不能手动提交) 触发器的类型 delete触发器 当删除表中记录时触发,自动执行触发器所定义的SQL语句 insert触发器 当向表中插入数据时触发,自动执行触发器所定义的SQL...语句 update触发器 当更新表中某列、多列时触发,自动执行触发器所定义的SQL语句 deleted和inserted表 触发器触发时 1.系统自动在内存中创建deleted表或inserted...deleted表临时保存了删除或更新前的记录行 2.可从deleted表中检查被删除的数据是否满足业务需求, 如果不满足,则向用户报告错误消息,并回滚插入操作 注意:更新(UPDATE)语句类似于在删除之后执行插入

    1.9K20

    C#三十三 事务

    在写入一些记录时,要么写入所有记录,要么什么都不写入。如果在写入一个记录时出现了一个失败,那么在事务处理中已写入的其他数据就会回滚。事务可能由很多单个任务构成。...查看数据时数据所处的状态,要么是事务修改它之前的状态,要么是事务修改它之后的状态。简单的理解就是,防止多个并发更新彼此干扰。事务在操作数据时与其他事务操作隔离。隔离性一般是通过加锁的机制来实现的。...持久性(Durability):事务完成之后,它对于系统的影响是永久性的。已提交的更改即使在发生故障时也依然存在。 对于事务的开发,.NET平台也为我们提供了几种非常简单方便的事务机制。...SQL和存储过程级别的事务​ 数据库事务是其他事务模型的基础,当一个事务创建时不同数据库系统都有自己的规则。...SQL Server默认在自动提交的模式下工作,每个语句执行完后都会立即提交;与此对照的是Oracle需要你包含一个提交语句。但是当一个语句通过OLE DB执行时,它执行完后一个提交动作会被附加上去。

    6410
    领券