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 ...
随机推荐
- python3.x 函数的参数
2016-08-09 15:06:18 位置参数 调用函数时,参数按照位置依次传递给函数 def show(a1,a2,a3,a4): print(a1,a2,a3,a4) show('s','h' ...
- 剑指offer-第四章解决面试题的思路(栈的压入和弹出序列)
题目:输入两个整数序列,第一个序列表示栈的压入序列,请判断第二个序列是否为弹出序列. 思路:定义两个指针sPush和sPop分别指向两个整数序列的开头,借助一个辅助的栈,将第一个序列的数据依次压入栈中 ...
- LeetCode Valid Parenthesis String
原题链接在这里:https://leetcode.com/problems/valid-parenthesis-string/description/ 题目: Given a string conta ...
- 转载Verilog乘法器
1. 串行乘法器 两个N位二进制数x.y的乘积用简单的方法计算就是利用移位操作来实现. module multi_CX(clk, x, y, result); input clk; input [7: ...
- CH1801 括号画家(栈模拟)
描述 Candela是一名漫画家,她有一个奇特的爱好,就是在纸上画括号.这一天,刚刚起床的Candela画了一排括号序列,其中包含小括号( ).中括号[ ]和大括号{ },总长度为N.这排随意绘制的括 ...
- 如何手玩5h uoj215 果冻运输得到 AC
最近在大力练习提答颓提答,听说果冻运输很好玩就来试试. 然后玩的停不下来 QAQ ... 于是开一篇博客写一下每个点的解法.(一个个手玩出来的..) 首先我们每次都算什么下一步完后会发生什么在大脑中演 ...
- 使用DeflateStream压缩与解压
具体可以了解下:http://msdn.microsoft.com/zh-cn/library/system.io.compression.deflatestream(v=vs.110).aspx / ...
- laravel 网站速率优化
https://segmentfault.com/a/1190000009954966
- volley 发送post请求
public static void postNewComment(Context context,final UserAccount userAccount,final String comment ...
- java中求利息的代码
总结:函数的重要性,懂得用哪一种函数 package com.badu; import java.util.Scanner; //输入存款金额 money.存期 year 和年利率 rate, //根 ...