Server嵌套事务处理的方法
源文档 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嵌套事务处理的方法的更多相关文章
- SQLServer 存储过程嵌套事务处理
原文:SQLServer 存储过程嵌套事务处理 某个存储过程可能被单独调用,也可能由其他存储过程嵌套调用,则可能会发生嵌套事务的情形. 下面是一种解决存储过程嵌套调用的通用代码,在不能确定存储过程是否 ...
- 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 ...
- Server.MapPath 的使用方法
Server.MapPath 的使用方法 用法: 1.Server.MapPath ("/") 应用程序根目录所在的位置 如 C:\Inetpub\wwwroot\ 2.Serve ...
- apache AH01630: client denied by server configuration错误解决方法
今天本来是想要在自己本地搭建一个wamp环境用来做一些代码的测试和框架的学习. 鉴于目前工作的时候用到了php5.5,所以就用了wamp-server V2.5版本,安装完成之后配置虚拟主机一直出现4 ...
- 删除SQL Server大容量日志的方法(转)
删除SQL Server大容量日志的方法 亲自实践的方法 1.分享数据库,如果提示被其他连接占用,不能分离,刚勾上drop connections 2.复制下所有文件,一定要备份好,以防自己操作失误 ...
- C#将图片存放到SQL SERVER数据库中的方法
本文实例讲述了C#将图片存放到SQL SERVER数据库中的方法.分享给大家供大家参考.具体如下: 第一步: ? 1 2 3 4 5 6 7 8 9 10 //获取当前选择的图片 this.pictu ...
- MyEclipse中点击Deploy MyEclipse J2EE Project to Server无响应解决方法
问题: MyEclipse中点击Deploy MyEclipse J2EE Project to Server无响应 解决方法: 如果工作空间的问题,那么需要删除你工作空间的一个文件就可以解决了.这个 ...
- SQL Server存储过程的删除方法
SQL Server存储过程的删除方法使我们经常会用到的,下面就为您介绍扩展存储过程的删除方法,如果您对SQL Server存储过程方面感兴趣的话,不妨一看. --清除SQL Server所有的危险扩 ...
- 实例讲解启动mysql server失败的解决方法
MySQL 实例讲解启动mysql server失败的解决方法 来源: 作者: 发表于: 启动mysql server 失败,查看/var/log/mysqld.err 080329 16:01:29 ...
随机推荐
- Hihocoder1081 最短路径 结构体练习
最短路径 :虽然做过很多次最短路的题,spfa,bellman,floyd都用过不少.但是题目强调的“顺序”又让我加深了对最短路的理解. 当然,主要还是练习下STL: pair型: #include& ...
- ASP.NET中服务器控件的生命周期
服务器控件的生命周期是创建服务器控件最重要的概念.作为开发人员,必须对服务器控件生命周期深刻理解.当然,这不是一朝一夕就可以做到的.对于学习控件开发技术的初学者,可以不必掌握得非常详细深入,只需对服务 ...
- matlab算法转为c语言注意事项
matlab算法转为c语言后,影响c语言效率的关键在于multiword的产生,基于此会有multiword加减法和乘除法,极大消耗资源,减少甚至消除multiword很重要,需注意的是:算法中尽量减 ...
- CF 1088(A , B , C , D)——思路
http://codeforces.com/contest/1088 A:Ehab and another construction problem 输出 2 和 n(偶数的话)或者 2 和 n-1( ...
- 为IIS Host ASP.NET Web Api添加Owin Middleware
将OWIN App部署在IIS上 要想将Owin App部署在IIS上,只添加Package:Microsoft.OWIN.Host.SystemWeb包即可.它提供了所有Owin配置,Middlew ...
- 我的HibernateSearch笔记
话不多说,直接上代码: 实体类: package com.smt.pojo; import java.io.Serializable; import javax.persistence.Column; ...
- UiAutomator viewer 在tools下启动、资源jar包在platforms下(如android22)
1.UiAutomator viewer 在tools下启动. 2.资源jar包在platforms下(如android22):android.jar/ uiautomator.jar
- mina2中IoHandler
IoHandler 当我们通过IoSession执行相关操作的时候,如写数据,这些事件会触发Mina框架抽象的IoService实例,从而调用Mina框架底层的相关组件进行处理.这时,配置的IoHan ...
- NOIP2005普及组第4题 循环
NOIP2005普及组第4题 循环 时间限制: 1 Sec 内存限制: 128 MB提交: 27 解决: 6[提交][状态][讨论版][命题人:外部导入] 题目描述 乐乐是一个聪明而又勤奋好学的孩 ...
- selenium自动化浏览器后台运行headless模式
通过selenium做WEB自动化的时候,必须要启动浏览器, 浏览器的启动与关闭会影响执行效率. 当我们在自己电脑运行代码时,还会影响做别的事情. 鉴于这种情况,Google针对Chrome浏览器新增 ...