源文档 http://wenku.baidu.com/link?url=yUH8Yhb8isIvJb8A7c0Hv_ktFSLt-JTvrQd2e2TGmFwzwGWqkjFfb1tXv5ZR1FmP52s9CPxuHn7b6fmwYbz28WryG-4-AwoBj3z7MkiWf6G
一.事务定义:事务是Sql Server的最小工作单元,每一个Sql语句就是一个事务,将工作单元指定为事务必须有四个属性,即ACID
标准:
原子性:事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。
一致性:事务在完成时,必须使所有的数据都保持一致状态。
隔离性:该事务对数据库进行的更改对其它事务来说是不可见的,
其它事务只会看到事务提交之前或之后的状态数据,其它事务不会查看中间状态的数据。
持久性:事务完成之后,它对于系统的影响是永久性的。
二.嵌套事务

Sql Server支持嵌套事务:也就是说在前一事务未完成之前可启动一个新的事务,只有在外层的Commit Tran语句才会导致数据库的永久更改。
请尝试执行以下语句:
BEGIN TRAN
        BEGIN TRAN
         ROLLBACK TRAN
ROLLBACK TRAN  
执行结果:服务器: 消息3903,级别16,状态1,行5
ROLLBACK TRANSACTION
请求没有对应的
BEGIN TRANSACTION。
原因分析:1)
Sql Server
把每个连接开启的事务数目记录在全局变量
@@trancount中,就象计数器一样,每个Begin Tran语句会让@@trancount自增1,每个Commit Tran语句会让@@trancount自减1,只有最外层的Commit Tran(当
@@trancount=1)会将更改影响到数据库中,而不再存储在事务日志中。2)
非常遗憾的是,不管嵌套的事务层次有多深,不带保存点的Rollback Tran语句将直接把@@trancount设置为0
解决思路:
1)
采用命名事务:可以对事务语句进行命名,让我们先尝试直接使用命名事务来解决刚
才的那个问题:
执行语句:
BEGIN TRAN A
        BEGIN TRAN B

ROLLBACK TRAN B
ROLLBACK TRAN A
执行结果:服务器: 消息6401,级别16,状态1,行 3 无法回滚B。没有找到任何该名称的事务或保存点。
原因分析:这是个美丽的误会 Sql Server只会记录外层事务名称,如果企图回滚任一内层事务,错误就会出现。

2)采用保存点:
Sql Server
提供了一种用于回滚部分事务的机制:
Save Tran ,它不会对@@trancount
产生任何影响,只是标记回滚事务时可以到达的点。--定义一个是否为嵌套事务的标志

DECLARE

@nestedFlag BIT

IF(@@trancount>0)
BEGIN
--
是嵌套事务:使用保存点,避免再次嵌套
SET @nestedFlag=1
SAVE TRAN TestA
END
ELSE
BEGIN
--
不是嵌套事务:开启一个事务
SET
 @nestedFlag=0
 BEGIN TRAN TestA
END
--
执行业务操作,
如果出错就回滚事务点,并立即返回
IF(@@error<>0)
BEGIN
     ROLLBACK TRAN TestA
     RETURN 0
END
--
如果不是嵌套事务才提交
IF(@nestedFlag=0)
BEGIN
     COMMIT TRAN TestA
END

-

Server嵌套事务处理的方法的更多相关文章

  1. SQLServer 存储过程嵌套事务处理

    原文:SQLServer 存储过程嵌套事务处理 某个存储过程可能被单独调用,也可能由其他存储过程嵌套调用,则可能会发生嵌套事务的情形. 下面是一种解决存储过程嵌套调用的通用代码,在不能确定存储过程是否 ...

  2. wamp出现You don’t have permission to access/on this server提示的解决方法

    本地搭建wamp 输入http://127.0.0.1访问正常,当输入http://localhost/ apache出现You don't have permission to access/on ...

  3. Server.MapPath 的使用方法

    Server.MapPath 的使用方法 用法: 1.Server.MapPath ("/") 应用程序根目录所在的位置 如 C:\Inetpub\wwwroot\ 2.Serve ...

  4. apache AH01630: client denied by server configuration错误解决方法

    今天本来是想要在自己本地搭建一个wamp环境用来做一些代码的测试和框架的学习. 鉴于目前工作的时候用到了php5.5,所以就用了wamp-server V2.5版本,安装完成之后配置虚拟主机一直出现4 ...

  5. 删除SQL Server大容量日志的方法(转)

    删除SQL Server大容量日志的方法 亲自实践的方法 1.分享数据库,如果提示被其他连接占用,不能分离,刚勾上drop connections 2.复制下所有文件,一定要备份好,以防自己操作失误 ...

  6. C#将图片存放到SQL SERVER数据库中的方法

    本文实例讲述了C#将图片存放到SQL SERVER数据库中的方法.分享给大家供大家参考.具体如下: 第一步: ? 1 2 3 4 5 6 7 8 9 10 //获取当前选择的图片 this.pictu ...

  7. MyEclipse中点击Deploy MyEclipse J2EE Project to Server无响应解决方法

    问题: MyEclipse中点击Deploy MyEclipse J2EE Project to Server无响应 解决方法: 如果工作空间的问题,那么需要删除你工作空间的一个文件就可以解决了.这个 ...

  8. SQL Server存储过程的删除方法

    SQL Server存储过程的删除方法使我们经常会用到的,下面就为您介绍扩展存储过程的删除方法,如果您对SQL Server存储过程方面感兴趣的话,不妨一看. --清除SQL Server所有的危险扩 ...

  9. 实例讲解启动mysql server失败的解决方法

    MySQL 实例讲解启动mysql server失败的解决方法 来源: 作者: 发表于: 启动mysql server 失败,查看/var/log/mysqld.err 080329 16:01:29 ...

随机推荐

  1. python3.x 函数的参数

    2016-08-09  15:06:18 位置参数 调用函数时,参数按照位置依次传递给函数 def show(a1,a2,a3,a4): print(a1,a2,a3,a4) show('s','h' ...

  2. 剑指offer-第四章解决面试题的思路(栈的压入和弹出序列)

    题目:输入两个整数序列,第一个序列表示栈的压入序列,请判断第二个序列是否为弹出序列. 思路:定义两个指针sPush和sPop分别指向两个整数序列的开头,借助一个辅助的栈,将第一个序列的数据依次压入栈中 ...

  3. LeetCode Valid Parenthesis String

    原题链接在这里:https://leetcode.com/problems/valid-parenthesis-string/description/ 题目: Given a string conta ...

  4. 转载Verilog乘法器

    1. 串行乘法器 两个N位二进制数x.y的乘积用简单的方法计算就是利用移位操作来实现. module multi_CX(clk, x, y, result); input clk; input [7: ...

  5. CH1801 括号画家(栈模拟)

    描述 Candela是一名漫画家,她有一个奇特的爱好,就是在纸上画括号.这一天,刚刚起床的Candela画了一排括号序列,其中包含小括号( ).中括号[ ]和大括号{ },总长度为N.这排随意绘制的括 ...

  6. 如何手玩5h uoj215 果冻运输得到 AC

    最近在大力练习提答颓提答,听说果冻运输很好玩就来试试. 然后玩的停不下来 QAQ ... 于是开一篇博客写一下每个点的解法.(一个个手玩出来的..) 首先我们每次都算什么下一步完后会发生什么在大脑中演 ...

  7. 使用DeflateStream压缩与解压

    具体可以了解下:http://msdn.microsoft.com/zh-cn/library/system.io.compression.deflatestream(v=vs.110).aspx / ...

  8. laravel 网站速率优化

    https://segmentfault.com/a/1190000009954966

  9. volley 发送post请求

    public static void postNewComment(Context context,final UserAccount userAccount,final String comment ...

  10. java中求利息的代码

    总结:函数的重要性,懂得用哪一种函数 package com.badu; import java.util.Scanner; //输入存款金额 money.存期 year 和年利率 rate, //根 ...