加入收藏 | 设为首页 | 会员中心 | 我要投稿 温州站长网 (https://www.0577zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQL Server误区:SQL Server中存在真正的“事务嵌套”

发布时间:2016-08-02 11:28:25 所属栏目:MsSql教程 来源:站长网
导读:误区 #26: SQL Server中存在真正的事务嵌套 错误 嵌套事务可不会像其语法表现的那样看起来允许事务嵌套。我真不知道为什么有人会这样写代码,我唯一能够想到的
误区 #26: SQL Server中存在真正的“事务嵌套”

错误

嵌套事务可不会像其语法表现的那样看起来允许事务嵌套。我真不知道为什么有人会这样写代码,我唯一能够想到的就是某个哥们对SQL Server社区嗤之以鼻然后写了这样的代码说:“玩玩你们”。

让我更详细的解释一下,SQL Server允许你在一个事务中开启嵌套另一个事务,SQL Server允许你提交这个嵌套事务,也允许你回滚这个事务。

但是,嵌套事务并不是真正的“嵌套”,对于嵌套事务来说SQL Server仅仅能够识别外层的事务。嵌套事务是日志不正常增长的罪魁祸首之一因为开发人员以为回滚了内层事务,仅仅是回滚内层事务。

但实际上当回滚内层事务时,会回滚整个内层事务,而不是仅仅是内层。这也是为什么我说嵌套事务并不存在。

所以作为开发人员来讲,永远不要对事务进行嵌套。事务嵌套是邪恶的。

如果你不相信我说的,那么通过下面的例子就就会相信。创建完数据库和表之后,每一条记录都会导致日志增加8K。

CREATE DATABASE NestedXactsAreNotReal;

GO

USE NestedXactsAreNotReal;

GO

ALTER DATABASE NestedXactsAreNotReal SET RECOVERY SIMPLE;

GO

CREATE TABLE t1 (c1 INT IDENTITY, c2 CHAR (8000) DEFAULT 'a');

CREATE CLUSTERED INDEX t1c1 ON t1 (c1);

GO

SET NOCOUNT ON;

GO

测试 #1:回滚内部事务时仅仅回滚内部事务?

BEGIN TRAN OuterTran;

GO

INSERT INTO t1 DEFAULT Values;

GO 1000

BEGIN TRAN InnerTran;

GO

INSERT INTO t1 DEFAULT Values;

GO 1000

SELECT @@TRANCOUNT, COUNT (*) FROM t1;

GO

你可以看到得出的结果是2和2000,下面我来回滚内部的事务,按照我们的猜想应该只回滚1000条吧,但事实上你会得到如下结果:

ROLLBACK TRAN InnerTran;

GO

消息 6401,级别 16,状态 1,第 2 行

无法回滚 InnerTran。找不到该名称的事务或保存点。

好吧,由Books Online来看,我只能使用外部事务的名称或是将事务名称留空来进行回滚,代码如下:

ROLLBACK TRAN;

GO

SELECT @@TRANCOUNT, COUNT (*) FROM t1;

GO

现在我得到结果是0和0。正如Books Online所言,这个回滚操作将外部事务进行了回滚并将全局变量@@TRANCOUNT设置为0。事务中所有的修改都被回滚,如果想部分回滚的话只能使用SAVE TRAN 和ROLLBACK TRAN。

(编辑:温州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读