1、调用两个存储过程

----------------------------------------------------------------
-- 表[dbo].[aaa_test]中[id]为主键
---------------------------------------------------------------- -- 存储过程1
ALTER PROCEDURE [dbo].[aaa_test_proc1]
@p_id int,
@p_name varchar(50)
AS
BEGIN
INSERT INTO [dbo].[aaa_test]
([id]
,[name])
VALUES
(@p_id
,@p_name)
END ---------------------------------------------------------------- -- 存储过程2
ALTER PROCEDURE [dbo].[aaa_test_proc2]
@p_id int,
@p_name varchar(50)
AS
BEGIN
INSERT INTO [dbo].[aaa_test]
([id]
,[name])
VALUES
(@p_id
,@p_name)
END ---------------------------------------------------------------- -- 调用两个存储过程
exec dbo.aaa_test_proc1 '','事务测试1'
exec dbo.aaa_test_proc2 '','事务测试2' ---------------------------------------------------------------- -- 结果
--(1 行受影响)
--消息 2627,级别 14,状态 1,过程 aaa_test_proc2,第 11 行
--违反了 PRIMARY KEY 约束 'PK_aaa_test'。不能在对象 'dbo.aaa_test' 中插入重复键。
--语句已终止。 -- 表[dbo].[aaa_test]:
id
name
1
事务测试1

-- 【结论】:不明确指定事务时,两次存储过程调用是分开的两个事务

2、在同一个事务中调用两个存储过程,没有事务的嵌套

----------------------------------------------------------------
-- 表[dbo].[aaa_test]中[id]为主键
---------------------------------------------------------------- -- 存储过程1
ALTER PROCEDURE [dbo].[aaa_test_proc1]
@p_id int,
@p_name varchar(50)
AS
BEGIN
INSERT INTO [dbo].[aaa_test]
([id]
,[name])
VALUES
(@p_id
,@p_name)
END ---------------------------------------------------------------- -- 存储过程2
ALTER PROCEDURE [dbo].[aaa_test_proc2]
@p_id int,
@p_name varchar(50)
AS
BEGIN
INSERT INTO [dbo].[aaa_test]
([id]
,[name])
VALUES
(@p_id
,@p_name)
END ---------------------------------------------------------------- -- 调用两个存储过程
BEGIN TRY
BEGIN TRAN
exec dbo.aaa_test_proc1 '','事务测试1'
exec dbo.aaa_test_proc2 '','事务测试2'
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK TRAN
END CATCH ---------------------------------------------------------------- -- 结果
--(1 行受影响) -- 表[dbo].[aaa_test]:
id
name
-- 【结论】:在同一个事务中调用多个存储过程,其中一个出错后,全部回滚。

3、事务嵌套

----------------------------------------------------------------
-- 表[dbo].[aaa_test]中[id]为主键
---------------------------------------------------------------- -- 存储过程1
ALTER PROCEDURE [dbo].[aaa_test_proc1]
@p_id int,
@p_name varchar(50)
AS
BEGIN
BEGIN TRY
BEGIN TRAN
INSERT INTO [dbo].[aaa_test]
([id]
,[name])
VALUES
(@p_id
,@p_name)
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK TRAN
END CATCH
END ---------------------------------------------------------------- -- 存储过程2
ALTER PROCEDURE [dbo].[aaa_test_proc2]
@p_id int,
@p_name varchar(50)
AS
BEGIN
INSERT INTO [dbo].[aaa_test]
([id]
,[name])
VALUES
(@p_id
,@p_name)
END ---------------------------------------------------------------- -- 调用两个存储过程
BEGIN TRY
BEGIN TRAN
exec dbo.aaa_test_proc1 '','事务测试1'
exec dbo.aaa_test_proc2 '','事务测试2'
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK TRAN
END CATCH ---------------------------------------------------------------- -- 结果
--(1 行受影响) -- 表[dbo].[aaa_test]:
id
name
-- 【结论】:事务嵌套时,以最外层事务的执行情况为准。
-- 例子中,虽然在第一个存储过程的子事务中有commit tran,且第一个存储过程执行没有问题。
-- 但是因为第二个存储过程因为主键冲突执行失败,所以最外层事务会进行回滚,因此测试表中没有插入任何数据。

-----打完收工-----

【SQL】关于存储过程调用过程中事务的点点滴滴的更多相关文章

  1. SQL Server 2008 安装过程中遇到“性能计数器注册表配置单元一致性”检查失败 问题的解决方法

    操作步骤: 1. 在 Microsoft Windows 2003 或 Windows XP 桌面上,依次单击"开始"."运行",然后在"打开&quo ...

  2. FormatMessage与GetLastError配合使用,排查windows api调用过程中的错误

    前一段时间在学习windows api调用过程中,遇到过一些调用错误或者程序没能显示预期的结果,或者直接出现vc运行时错误. 这对新手来说是司空见惯的事,因为不太熟悉难免会出错,出错的信息如果能显示很 ...

  3. SQL Server 2008安装过程中的一些问题和心得

    开博客已经好久了,但一直没有用起来,也有很多"老人"劝诫我,好记性不如烂笔头,于是一年后的我重拾博客,打算记录一些我在计算机方面遇到的一些问题和心得. 前几天重装了Win10系统, ...

  4. C#调用SQL中的存储过程中有output参数,存储过程执行过程中返回信息

      C#调用SQL中的存储过程中有output参数,类型是字符型的时候一定要指定参数的长度.不然获取到的结果总是只有第一字符.本人就是由于这个原因,折腾了很久.在此记录一下,供大家以后参考! 例如: ...

  5. SQL Server 2017 安装过程中的一点说明(有点意思)

    会提到:“安装程序无法与下载服务器联系.请提供 Microsoft 机器学习服务器安装文件的位置,然后单击“下一步”.可从以下位置下载安装文件” 的解决方案 安装过程和2016大体一致,机器学习这款更 ...

  6. sql server 2008安装过程中服务器配置出错

    请选择:对所有 SQL Server 服务使用相同的账号: 但这里不能给他设置自己定义的账号和密码 ( 例如下面设置它的账号为 sa ,密码为 654321) 就会发生错误:

  7. sql server存储过程调用C#编写的DLL文件

    新建C#类库,编译. 引用 using Microsoft.SqlServer.Server; 方法 [SqlFunction]public static int GenerateTxt(){ ... ...

  8. SQL SERVER数据库使用过程中系统提示死锁处理办法

    马上双节(国庆节.中秋节)了,这篇文章是双节前的最后一篇,祈祷过节期间,数据库稳定运行,服务器正常发挥.祝大家假期愉快!!!! 任何的数据库都会出现死锁的情况,特别是一些大型的复杂业务,数据库架构的设 ...

  9. sql的存储过程调用

    USE [ChangHong_612]GO/****** Object: StoredProcedure [dbo].[st_MES_GetCodeRule] Script Date: 09/10/2 ...

随机推荐

  1. 用C++ 自娱自乐

    最无聊的时光当属 考试前的复习时段了,在一些论坛上看到一些用字符组成的图像,觉得有点意思,于是,自己 用C++ 参考一些论坛的图像,写了下面这个东西,来表达此时的心情. #include<ios ...

  2. 【不积跬步,无以致千里】linux下如何查看自己的外网IP

    局域网的服务器是通过ADSL路由器连接外网的,但ADSL是从ISP运营商那儿通过动态获得IP的,那么我怎么知道自己的外网地址是多少呢?今天得到几个办法:curl -s http://whatismyi ...

  3. Spring 的两个配置容器的讲解

    容器 是Spring框架的核心,是组件存活的地方.Spring容器使用DI管理所有组成应用系统的组件,协作组件之间建立联.而且, 这些对象简洁易懂,降低耦合性,支持重用,容易被测试. Spring提供 ...

  4. RFID与射频卡电器特性

    电气特性: 容量为8K位EEPrOM: ● 分为16个扇区,每个扇区为4块,每块16个字节,以块为存取单位: ● 每个扇区有独立的一组密码及访问控制: ● 每张卡有唯一序列号,为32位: ● 具有防冲 ...

  5. 如何防止ListView控件闪烁

    如何防止ListView控件闪烁 beginupdate()和endupdate()之间写代码   ListView1.Items.BeginUpdate;ListView1.Items.Add('A ...

  6. Select模型原理

    Select模型原理 利用select函数,推断套接字上是否存在数据,或者是否能向一个套接字写入数据.目的是防止应用程序在套接字处于锁定模式时,调用recv(或send)从没有数据的套接字上接收数据, ...

  7. Delphi 7连接MySql 5.5.15

    原文:http://blog.csdn.net/akof1314/article/details/6822902/ 网上有很多关于Delphi连接MySql数据库的文章,在这里,我只记录下自己测试过的 ...

  8. iOS NSString常用用法大全

    版权声明:本文为博主Atany原创文章,未经博主允许不得转载.博客地址:http://blog.csdn.net/yang8456211 一.NSRange 在对NSString介绍之前,我们先要了解 ...

  9. iOS开发——适配篇&App适配简单概括

    App适配简单概括 1:适配:适应.兼容各种不同的情况 系统适配 针对不同版本的操作系统进行适配 屏幕适配 针对不同大小的屏幕尺寸进行适配 在用户眼中 屏幕是由无数个像素组成的 像素越多,屏幕越清晰 ...

  10. 判断IE中iframe完美加载完毕的方法

    转: var iframe = document.createElement("iframe"); iframe.src = "http://www.planabc.ne ...