在公司项目中看到有这样使用事务的:

-- 开启事务
BEGIN TRAN
INSERT TABLE1(ID) VALUES (1)
INSERT TABLE2(ID) VALUES (2)
UPDATE TABLE3 SET ID=3
IF @@ERROR > 0
BEGIN
ROLLBACK TRAN
RETURN 1003
END
COMMIT TRAN

乍一看没啥问题,仔细思考就能发现有很大的问题。

@@ERROR:并不是错误的计数器,而是没执行一条SQL语句就会产生一个新的@@ERROR。

那有人就会觉得那只有一条增删改的时候就可以这么用。

是可以,但是还是要谨慎。下面也是在公司项目中看到的错误例子:

-- 开启事务
BEGIN TRAN
INSERT TABLE1(ID) VALUES (1)
SET @New_ID = SCOPE_IDENTITY()
IF @@ERROR > 0
BEGIN
ROLLBACK TRAN
RETURN 1003
END
COMMIT TRAN

所以这种写法有很大的问题,这种问题就导致数据错乱。

正确使用事务:

BEGIN TRY                -- 这里没有Try也是可以的
SET XACT_ABORT ON; -- 执行 Transact-SQL 语句产生运行时错误,则整个事务将终止并回滚
BEGIN TRAN
  INSERT INTO TABLE1 SELECT 1
  INSERT INTO TABLE2 SELECT 2
  UPDATE TABLE3 Set ID = 3
COMMIT TRANEND TRY
BEGIN CATCH
RAISERROR ('修改异常!',16,1) --抛出异常
END CATCH

SQL Server @@ERROR的小误区大Bug的更多相关文章

  1. MS SQL错误:SQL Server failed with error code 0xc0000000 to spawn a thread to process a new login or connection. Check the SQL Server error log and the Windows event logs for information about possible related problems

          早晨宁波那边的IT人员打电话告知数据库无法访问了.其实我在早晨也发现Ignite监控下的宁波的数据库服务器出现了异常,但是当时正在检查查看其它服务器发过来的各类邮件,还没等到我去确认具体情 ...

  2. [小细节,大BUG]记录一些小问题引起的大BUG(长期更新....)

    [小细节,大BUG] 6.问题描述:当从Plist文件加载数据,放入到tableView中展示时,有时有数据,有时又没有数据.这是为什么呢?相信很多大牛都想到了:我们一般将加载的数据,转换成模型,放入 ...

  3. Invalid object name ‘sys.configurations’. (Microsoft SQL Server, Error: 208)

    http://blogs.msdn.com/b/ramaprasanna/archive/2009/09/16/invalid-object-name-sys-configurations-micro ...

  4. SQL Server error

    原因:文件没有权限 出错: TITLE: Microsoft SQL Server Management Studio------------------------------ Attach dat ...

  5. [SQL SERVER] The CHECK_POLICY and CHECK_EXPIRATION options cannot be turned OFF when MUST_CHANGE is ON. (Microsoft SQL Server, Error: 15128)

    The CHECK_POLICY and CHECK_EXPIRATION options cannot be turned OFF when MUST_CHANGE is ON. (Microsof ...

  6. safari 与 chrome 的小区别大BUG

    safari 与 chrome 的小区别大BUG 时间:2016-11-01 17:33:19 作者:zhongxia 原文地址:https://github.com/zhongxia245/blog ...

  7. SQL Server在本地计算机上用SSMS(SQL Server Management Studio)登录不上,错误消息:(Microsoft SQL Server, Error: 18456)

    今天遇到了一个奇怪的问题,公司目前在SQL Server上都采用AD域账号登录,由于账号人数众多,所以我们建立了一个AD Group(域组),将大家的AD账号加入了这个AD Group,然后我们将这个 ...

  8. SQL Server内存理解的误区

    SQL Server内存理解 内存的读写速度要远远大于磁盘,对于数据库而言,会充分利用内存的这种优势,将数据尽可能多地从磁盘缓存到内存中,从而使数据库可以直接从内存中读写数据,减少对机械磁盘的IO请求 ...

  9. SQL server Error Number

    描述 HY000 所有绑定列都是只读的. 必须是可升级的列,以使用 SQLSetPos 或 SQLBulkOperations 更改或插入行. HY000 已检测到一个旧 netlib (%s).请删 ...

随机推荐

  1. 为什么阿里巴巴禁止开发人员使用isSuccess作为变量名

    答曰,是为了防止用加了is前缀命名的变量造成序列化与反序列不一致的问题

  2. ABP框架是怎么一回事呢?

    ABP(ASP.NET Boilerplate['bɔɪlɚplet]:样板文件),就是一套基于.Net开源框架,官方地址为:https://aspnetboilerplate.com/ , 在这个地 ...

  3. 【ASP.NET MVC系列】浅谈ASP.NET MVC 视图与控制器传递数据

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  4. TCP中往返时间的估计与超时

    往返时间的估计与超时   TCP采用超时/重传机制来处理报文段的丢失问题.尽管这在概念上面很简单,但是在实际中还是会产生很多微妙的问题.最明显还是超时时间间隔的设置.很显然,这个时间间隔肯定会大于RT ...

  5. Tomcat的Https设置及Http自动跳转Https

    Https相关介绍    Https是由NetScape公司设计的一个基于Http的加密传输协议,可以这样理解Https = Http +SSL(安全套接层),Https的端口为443,而且还需要申请 ...

  6. Maven(七)Eclipse使用Maven命令

    由于没有mvn compile (其余命令类似) 可以点解上面框中选项手动输入compile

  7. css重写checkbox样式

    一.前言 默认的checkbox长这样: <p> <span><input type="checkbox" /></span> &l ...

  8. js对HTML字符转义与反转义

    注意: 在编写html时,经常需要转义,才能正常显示在页面上. 并且,还可以防止xss. 解决方案: 一, 使用正则: 使用正则转码: var value = document.getElementB ...

  9. 整理:手机端弹出提示框,使用的bootstrap中的模态框(modal,弹出层),比kendo弹出效果好

    效果图: 我的代码示例: <!--提示模态框--> <div class="modal fade" id="myModal" tabindex ...

  10. js 从一个对象中找到属性值相等的集合

    getobjs: function(objs, key, value) { var result = []; for (var i in objs) { var obj = $(objs[i]); i ...