ADOConnectoin事务和存储过程中的Begin tran commit
一直以来我都是在存储过程中使用事务
create proc usp_proc
begin
begin tran
.....
commit
end
那么我现在问一个问题,如果在BCB的代码中写这样的代码
ADOConnection->BeginTrans();
ADOQuery->SQL->Text = "EXEC usp_proc ";
//ADOConnection->CommitTrans(); <---注意,我没有提交事务!
那么存储过程中的事务会提交吗?
答案是:NO
--------------------------------------------
那么现在来回答,为什么存储过程中的事务没有提交。
本质原因是因为:存储过程中的事务没有命名。
它只是简单的写了
BEGIN TRAN
COMMIT
于是问题就来,当BCB启动了一个事务的时候,
执行存储过程 到COMMIT 处,SQL SERVER 到底是提交 BCB代码中 BeginTrans 开启的事务呢,还是 存储过程中的事务呢?
因为没有显示的指定要提交哪一个事务,所以,SQL SERVER 就提交“上一个”;(类似计数器风格)
因为BCB 代码中的事务是先开始的,所以SQL SERVER 提交的是 BCB代码中的事务。也就是说,存储过程中的事务并没有提交。
那么,假设你的存储过程中有一个 TABLOCKX ,会怎样,全部都会阻塞。
总结一句话,COMMIT 这样的代码,是让SQL SERVER 简单的提交上一个事务而已。
换句话说,你可以这么写代码(如果你真的这么写,被开除了不要怪我)
BCB中
ADOConnectin->BeginTrans();
然后执行存储过程。
存储过程中这么写
create proc usp_proc
as
begin
。。。。do sth
commit; <---直接写一个commit,它就会提交BCB代码中的事务。
end
那么如何保证存储过程中的事务提交呢?
答案是给事务命名
具体的写法看MSDN 的例子,这样,即使BCB得事务没有提交,SQL SERVER 也一定会提交存储过程中的事务的。
DECLARE @TranName VARCHAR(20);
SELECT @TranName = 'MyTransaction'; BEGIN TRANSACTION @TranName;
USE AdventureWorks2008R2;
DELETE FROM AdventureWorks2008R2.HumanResources.JobCandidate
WHERE JobCandidateID = 13; COMMIT TRANSACTION @TranName;
GO
再谈谈BCB中能不呢个对事务进行命名。答案是:NO
再来谈谈事务和会话的关系,一个会话可以有多个事务,比如 先执行事务A,再执行事务B,再提交事务A,然后提交事务B ,
这其实是事务嵌套,B事务嵌套到A事务中了。
用一个ADOConnection 做不到,只能借助存储过程来做。切记,BCB的ADOConnection 只能开启一个事务。
ADOConnectoin事务和存储过程中的Begin tran commit的更多相关文章
- sql语句中BEGIN TRAN...COMMIT TRAN
BEGIN TRAN标记事务開始 COMMIT TRAN 提交事务 一般把DML语句(select ,delete,update,insert语句)放在BEGIN TRAN...COMMIT TR ...
- BEGIN TRAN...COMMIT TRAN 意思与用法
BEGIN TRAN标记事务开始 COMMIT TRAN 提交事务 一般把DML语句(select ,delete,update,insert语句)放在BEGIN TRAN...COMMIT TRAN ...
- Sql Server 中事务(begin tran/commit tran/rollback tran)的用法
ALTER PROCEDURE [dbo].[Proc_Test_commit1] @result int output, --成功 1; 失败 0 @message nvarchar ...
- 数据库事务及其EF中如何处理事务
一.基础知识 1) 使用事务级别ReadUnCommited 会产生脏读现像,意味着读取到的为UnCommited(未提交)的数据.怎么理解呢?在使用该隔离级别的事务开始后.更新了数据 ...
- SQL 事务 begin tran、commit tran、rollback tran 的用法
首先理解一下这三个事务的大概意思: begin Transaction 可以理解成新建一个还原点. commit Transaction 提交这个自begin tran开始的修改 rollback T ...
- SQLServer------begin tran/commit tran事务的使用方法
转载: http://www.cnblogs.com/accumulater/p/6089838.html 介绍 BEGIN TRAN 标记事务开始 COMMIT TRAN 提交事务 一般把DML语句 ...
- MySQL存储过程中declare和set定义变量的区别
在存储过程中常看到declare定义的变量和@set定义的变量.简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量. 1.declare定义的变量类似java类中的局部变量,仅 ...
- sqlserver中事务总结:begin tran,rollback tran,commit tran
第1个相关用法:摘自:https://shiyousan.com/post/f13d29b7-0d87-4168-bd8b-8b28b0991b5a 以下是出现错误的SQL部分语句: 此错误的原因是 ...
- sql server 存储过程中,调用事务 tran
Sql Server 2005/2008中提供了begin tran,commit tran和rollback tran来使用事务. begin tran表示开始事务, commit tran表示 ...
随机推荐
- js预解析及特效
预解析: // 作用域: // 域:空间.范围.区域…… // 作用:读.写 script 全局变量.全局函数 自上而下 函数 由里到外 {} 浏览器: “JS解析器” 1)“找一些东西” :var ...
- XMPP 和 OpenFire
XMPP XMPP(可扩展消息处理现场协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线现场探测.是一种数据传输协议. XMPP的前身是Jabber,一个开源形式组织产生的网络 ...
- 【OpenCV练习】简单显示图片的代码
今天依照网上的教程尝试了一下最基本的图片显示. 首先想说一下编译时出现的问题,开始时在编译时会出现无法识别cvReleaseImage的情况,是因为没有在配置中包含相应的core的库文件. 加进去就解 ...
- jQuery MiniUI开发系列之:安装部署
jQuery MiniUI是一套纯Javascript的WebUI控件库,它由几十个Javascript控件组成,是不依赖服务端和数据库的. 下载jQuery MiniUI,解压缩后,开发者可以直接在 ...
- Django RedirectView
RedirectView作用是重定向一个指定,给定的Url.这个给定的Url可能包含有字典风格的字符串,因为关键字(词)会被改变,所以从这个Url中捕获的参数可能也会被修改,例如,Url中的“%”应该 ...
- java中的集合和区别
Iterator接口是负责定义访问和遍历元素的接口 Connection接口存储了一组不唯一(允许重复)的无序对象 Set接口继承了Connection接口,主要用来存储一组唯一(不允许重复的),无序 ...
- GHOST(幽灵)重大漏洞
cd /usr/local/srcwget https://webshare.uchicago.edu/orgs/ITServices/itsec/Downloads/GHOST.cgcc GHOST ...
- Ping出现TTL expired in transit的原因
今天上班检查服务器时发现出现TTL expired in transit的提示,这种提示还是第一次见,如图: ping 和 tracert 的结果 用tracert来看路由状况,原来是出现路由环路导致 ...
- 《疯狂Java讲义》(四)---- 面向对象&基于对象
"基于对象"也使用了对象,但是无法利用现有的对象模板产生新的对象类型,继而产生新的对象,也就是说,"基于对象"没有继承的特点,而多态更需要继承,所以" ...
- 关于JavaScript lastIndexOf() 方法 w3school.com.cn写的不一定全对
关于JavaScript lastIndexOf() 方法 w3school.com.cn的表述是 定义和用法 lastIndexOf() 方法可返回一个指定的字符串值最后出现的位置,在一个字符串中的 ...