【SQL】关于存储过程调用过程中事务的点点滴滴
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】关于存储过程调用过程中事务的点点滴滴的更多相关文章
- SQL Server 2008 安装过程中遇到“性能计数器注册表配置单元一致性”检查失败 问题的解决方法
操作步骤: 1. 在 Microsoft Windows 2003 或 Windows XP 桌面上,依次单击"开始"."运行",然后在"打开&quo ...
- FormatMessage与GetLastError配合使用,排查windows api调用过程中的错误
前一段时间在学习windows api调用过程中,遇到过一些调用错误或者程序没能显示预期的结果,或者直接出现vc运行时错误. 这对新手来说是司空见惯的事,因为不太熟悉难免会出错,出错的信息如果能显示很 ...
- SQL Server 2008安装过程中的一些问题和心得
开博客已经好久了,但一直没有用起来,也有很多"老人"劝诫我,好记性不如烂笔头,于是一年后的我重拾博客,打算记录一些我在计算机方面遇到的一些问题和心得. 前几天重装了Win10系统, ...
- C#调用SQL中的存储过程中有output参数,存储过程执行过程中返回信息
C#调用SQL中的存储过程中有output参数,类型是字符型的时候一定要指定参数的长度.不然获取到的结果总是只有第一字符.本人就是由于这个原因,折腾了很久.在此记录一下,供大家以后参考! 例如: ...
- SQL Server 2017 安装过程中的一点说明(有点意思)
会提到:“安装程序无法与下载服务器联系.请提供 Microsoft 机器学习服务器安装文件的位置,然后单击“下一步”.可从以下位置下载安装文件” 的解决方案 安装过程和2016大体一致,机器学习这款更 ...
- sql server 2008安装过程中服务器配置出错
请选择:对所有 SQL Server 服务使用相同的账号: 但这里不能给他设置自己定义的账号和密码 ( 例如下面设置它的账号为 sa ,密码为 654321) 就会发生错误:
- sql server存储过程调用C#编写的DLL文件
新建C#类库,编译. 引用 using Microsoft.SqlServer.Server; 方法 [SqlFunction]public static int GenerateTxt(){ ... ...
- SQL SERVER数据库使用过程中系统提示死锁处理办法
马上双节(国庆节.中秋节)了,这篇文章是双节前的最后一篇,祈祷过节期间,数据库稳定运行,服务器正常发挥.祝大家假期愉快!!!! 任何的数据库都会出现死锁的情况,特别是一些大型的复杂业务,数据库架构的设 ...
- sql的存储过程调用
USE [ChangHong_612]GO/****** Object: StoredProcedure [dbo].[st_MES_GetCodeRule] Script Date: 09/10/2 ...
随机推荐
- Objective-C :Category
Category 引入 在日常的开发中,可能会碰到这样的需求:给某个类增加方法.比如说,需要给NSString类增加一个打印的方法.当然,我们可以新建一个类比如TestString,并继承NSStri ...
- SQl函数的写法
USE [ChangHong_612]GO/****** Object: UserDefinedFunction [dbo].[FN_GetProdQty] Script Date: 10/08/20 ...
- Connection 连接字符串释义
本文将详细介绍如何使用Connection对象连接数据库.对于不同的.NET数据提供者,ADO.NET采用不同的Connection对象连接数据库.这些Connection对象为我们屏蔽了具体的实现细 ...
- INV(库存管理)
物料 PROCEDURE update_item(p_init_msg_list IN VARCHAR2 DEFAULT fnd_api.g_false, x_return_status OUT NO ...
- 使用jdk操作 wsdl2java (wedservice)
打开jdk下的bin目录 看下能否找到"wsimport.exe"这个文件 一般情况下都会有 如果没有则说明你的JDK不支持这个功能 然后在DOS窗口下输入wsimport 敲回车 ...
- C#多线程开发
1.进程与线程的区别 通俗的讲,进行就是任务管理器中进行列表中看到的正在运行的程序,它是一个动态的概念,活动的实体. 线程是程序执行流的最小单元,是线程中一个实体,是系统独立调度和分派CPU基本单位. ...
- “WinMount”和“云端”真是相当好用!
WinMount作为一款压缩文件管理以及虚拟光驱工具已经无敌了.更有两项功能相当好用: 1.将rar.zip等压缩文件直接虚拟成磁盘,也就是下载一个7G的游戏可以不用解压直接安装了! 2.右键压缩文件 ...
- VS里面如何设置环境默认的开发语言
- C语言调用Lua函数
记得上学时,初中英文课本中,上网叫做surfing the internet,中文叫网上冲浪. 那个时期,人们常常称互联网为赛博空间.现在工作了,大量的零碎时间用于上微博,知乎,QQ.这些碎片化的阅读 ...
- python基础(5):深入理解 python 中的赋值、引用、拷贝、作用域
http://my.oschina.net/leejun2005/blog/145911 http://www.cnblogs.com/lulipro/p/5060163.html http://ww ...