1、调用两个存储过程

  1. ----------------------------------------------------------------
  2. -- 表[dbo].[aaa_test]中[id]为主键
  3. ----------------------------------------------------------------
  4.  
  5. -- 存储过程1
  6. ALTER PROCEDURE [dbo].[aaa_test_proc1]
  7. @p_id int,
  8. @p_name varchar(50)
  9. AS
  10. BEGIN
  11. INSERT INTO [dbo].[aaa_test]
  12. ([id]
  13. ,[name])
  14. VALUES
  15. (@p_id
  16. ,@p_name)
  17. END
  18.  
  19. ----------------------------------------------------------------
  20.  
  21. -- 存储过程2
  22. ALTER PROCEDURE [dbo].[aaa_test_proc2]
  23. @p_id int,
  24. @p_name varchar(50)
  25. AS
  26. BEGIN
  27. INSERT INTO [dbo].[aaa_test]
  28. ([id]
  29. ,[name])
  30. VALUES
  31. (@p_id
  32. ,@p_name)
  33. END
  34.  
  35. ----------------------------------------------------------------
  36.  
  37. -- 调用两个存储过程
  38. exec dbo.aaa_test_proc1 '','事务测试1'
  39. exec dbo.aaa_test_proc2 '','事务测试2'
  40.  
  41. ----------------------------------------------------------------
  42.  
  43. -- 结果
  44. --(1 行受影响)
  45. --消息 2627,级别 14,状态 1,过程 aaa_test_proc2,第 11
  46. --违反了 PRIMARY KEY 约束 'PK_aaa_test'。不能在对象 'dbo.aaa_test' 中插入重复键。
  47. --语句已终止。
  48.  
  49. -- 表[dbo].[aaa_test]:
  1. id
  1. name
  1. 1
  1. 事务测试1
  1.  
  2. -- 【结论】:不明确指定事务时,两次存储过程调用是分开的两个事务

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

  1. ----------------------------------------------------------------
  2. -- 表[dbo].[aaa_test]中[id]为主键
  3. ----------------------------------------------------------------
  4.  
  5. -- 存储过程1
  6. ALTER PROCEDURE [dbo].[aaa_test_proc1]
  7. @p_id int,
  8. @p_name varchar(50)
  9. AS
  10. BEGIN
  11. INSERT INTO [dbo].[aaa_test]
  12. ([id]
  13. ,[name])
  14. VALUES
  15. (@p_id
  16. ,@p_name)
  17. END
  18.  
  19. ----------------------------------------------------------------
  20.  
  21. -- 存储过程2
  22. ALTER PROCEDURE [dbo].[aaa_test_proc2]
  23. @p_id int,
  24. @p_name varchar(50)
  25. AS
  26. BEGIN
  27. INSERT INTO [dbo].[aaa_test]
  28. ([id]
  29. ,[name])
  30. VALUES
  31. (@p_id
  32. ,@p_name)
  33. END
  34.  
  35. ----------------------------------------------------------------
  36.  
  37. -- 调用两个存储过程
  38. BEGIN TRY
  39. BEGIN TRAN
  40. exec dbo.aaa_test_proc1 '','事务测试1'
  41. exec dbo.aaa_test_proc2 '','事务测试2'
  42. COMMIT TRAN
  43. END TRY
  44. BEGIN CATCH
  45. ROLLBACK TRAN
  46. END CATCH
  47.  
  48. ----------------------------------------------------------------
  49.  
  50. -- 结果
  51. --(1 行受影响)
  52.  
  53. -- 表[dbo].[aaa_test]:
  1. id
  1. name
  1. -- 【结论】:在同一个事务中调用多个存储过程,其中一个出错后,全部回滚。

3、事务嵌套

  1. ----------------------------------------------------------------
  2. -- 表[dbo].[aaa_test]中[id]为主键
  3. ----------------------------------------------------------------
  4.  
  5. -- 存储过程1
  6. ALTER PROCEDURE [dbo].[aaa_test_proc1]
  7. @p_id int,
  8. @p_name varchar(50)
  9. AS
  10. BEGIN
  11. BEGIN TRY
  12. BEGIN TRAN
  13. INSERT INTO [dbo].[aaa_test]
  14. ([id]
  15. ,[name])
  16. VALUES
  17. (@p_id
  18. ,@p_name)
  19. COMMIT TRAN
  20. END TRY
  21. BEGIN CATCH
  22. ROLLBACK TRAN
  23. END CATCH
  24. END
  25.  
  26. ----------------------------------------------------------------
  27.  
  28. -- 存储过程2
  29. ALTER PROCEDURE [dbo].[aaa_test_proc2]
  30. @p_id int,
  31. @p_name varchar(50)
  32. AS
  33. BEGIN
  34. INSERT INTO [dbo].[aaa_test]
  35. ([id]
  36. ,[name])
  37. VALUES
  38. (@p_id
  39. ,@p_name)
  40. END
  41.  
  42. ----------------------------------------------------------------
  43.  
  44. -- 调用两个存储过程
  45. BEGIN TRY
  46. BEGIN TRAN
  47. exec dbo.aaa_test_proc1 '','事务测试1'
  48. exec dbo.aaa_test_proc2 '','事务测试2'
  49. COMMIT TRAN
  50. END TRY
  51. BEGIN CATCH
  52. ROLLBACK TRAN
  53. END CATCH
  54.  
  55. ----------------------------------------------------------------
  56.  
  57. -- 结果
  58. --(1 行受影响)
  59.  
  60. -- 表[dbo].[aaa_test]:
  1. id
  1. name
  1. -- 【结论】:事务嵌套时,以最外层事务的执行情况为准。
    -- 例子中,虽然在第一个存储过程的子事务中有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. <select>改造成<s:select>实现表单的回显功能

    初始: <select name="viewType"> <option value="0">全部主题</option> & ...

  2. Realsense 提取彩色和深度视频流

    一.简要介绍 关于realsense的介绍,网上很多,这里不再赘述,sdk及相关文档可参考realsense SDK,也可参考开发人员专区. 运行代码之前,要确保你已经安装好了realsense的DC ...

  3. 教你50招提升ASP.NET性能(十九):静态集合

    (30)Static collections 招数30: 静态集合 If a collection is static, make sure it only contains the objects ...

  4. 对PostgreSQL中tablespace 与 database, table的理解

    开始: 当前的tablesapce信息 pgsql=# select * from pg_tablespace; spcname | spcowner | spclocation | spcacl | ...

  5. 下载discuz 6 论坛的附件

    前段时间我下了个python脚本把emsky的附件全部下载了,之前是因为偶然发现emsky附件不登陆也能访问,直接访问一个url就行了. 后来发现大部分discuz6的论坛都有这个bug,我想是因为d ...

  6. SpringMVC经典系列-14自己定义SpringMVC的拦截器---【LinusZhu】

    注意:此文章是个人原创.希望有转载须要的朋友们标明文章出处.假设各位朋友们认为写的还好,就给个赞哈.你的鼓舞是我创作的最大动力,LinusZhu在此表示十分感谢,当然文章中如有纰漏,请联系linusz ...

  7. Cucumber 入门一

    (转自:http://www.cnblogs.com/jarodzz/archive/2012/07/02/2573014.html) 第一次看到Cucumber和BDD(Behavior Drive ...

  8. Asp.Net页面(母版页)加载顺序

    ASP.NET 母版页和内容页中的事件 母版页和内容页都可以包含控件的事件处理程序.对于控件而言,事件是在本地处理的,即内容页中的控件在内容页中引发事件,母版页中的控件在母版页中引发事件.控件事件不会 ...

  9. HBase Error: connection object not serializable

    HBase Error: connection object not serializable 想在spark driver程序中连接HBase数据库,并将数据插入到HBase,但是在spark集群提 ...

  10. BestCoder Sequence

    hdu  4908  Bestcoder Problem Description Mr Potato is a coder.Mr Potato is the BestCoder. One night, ...