当前位置: 首页 > news >正文

电影微网站开发/链接买卖价格

电影微网站开发,链接买卖价格,wordpress 如何安装教程,网站建设详细流程转自 https://www.cnblogs.com/guanjie20/archive/2013/02/17/2914488.html 我们在写事务时经常遇到的问题如下: 消息 266,级别 16,状态 2,过程 sp1,第 0 行EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配…

转自 https://www.cnblogs.com/guanjie20/archive/2013/02/17/2914488.html

我们在写事务时经常遇到的问题如下:

消息 266,级别 16,状态 2,过程 sp1,第 0 行
EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配。上一计数 = 1,当前计数 = 0。
消息 3903,级别 16,状态 1,过程 sp2,第 15 行
ROLLBACK TRANSACTION 请求没有对应的 BEGIN TRANSACTION

如果这只是一个单独的事务引起的,那么很好解决,我们只要检查下是否遗漏了匹配的BEGIN tran 和 COMMIT tran即可,但是如果2个存储过程都是用事务写的,那么就即使每个存储过程的事务写法都正常,也会报这个错误,

这是因为只要子事务里有回滚语句:如ROLLBACK      那么全局的@@TRANCOUNT被直接置为0了,导致父事务提交时发现 @@TRANCOUNT=0  报错 ,sql server会认为当前不存在任何事务,在父存储过程中任何的COMMIT TRAN或

ROLLBACK 语句都会找不到它对应的 BEGIN TRAN   

下面我们用一个实例来看下:

假设有一张表,ID为非自增主键

USE [TestDB]
GO/****** Object:  Table [dbo].[test]    Script Date: 02/17/2013 15:44:35 ******/
SET ANSI_NULLS ON
GOSET QUOTED_IDENTIFIER ON
GOSET ANSI_PADDING ON
GOCREATE TABLE [dbo].[test]([ID] [bigint] NOT NULL,[UserID] [bigint] NULL,[Name] [varchar](50) NULL,CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED 
([ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]GOSET ANSI_PADDING OFF
GO

我们常规的写一个插入的子存储过程如下:

USE [TestDB]
GO
/****** Object:  StoredProcedure [dbo].[innertranv1]    Script Date: 02/17/2013 15:46:46 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO--内层事务存储过程,演示如何处理才能在嵌套的事务存储过程中正确处理事务
ALTER PROCEDURE [dbo].[innertranv1]@ID BIGINT ,@UserID BIGINT ,@Name VARCHAR(50)
AS BEGINSET XACT_ABORT ON    BEGIN TRAN    IF(EXISTS(SELECT TOP 1 * FROM dbo.test WHERE ID=@ID))    BEGINROLLBACK        RETURN 0 ;  END--业务逻辑开始INSERT  dbo.test( ID, UserID, Name)VALUES  ( @ID, @UserID,@Name  )--业务逻辑结束IF @@error <> 0 BEGIN  ROLLBACK                                   RETURN 0;  END        COMMIT   SET XACT_ABORT OFF;   RETURN 1 ; END

调用的父存储过程如下:

USE [TestDB]
GO
/****** Object:  StoredProcedure [dbo].[outertranv2]    Script Date: 02/17/2013 16:09:09 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO-- =============================================
-- Author:        <Author,,Name>
-- Create date: <Create Date,,>
-- Description:    <外层存储过程>
-- =============================================
ALTER PROCEDURE [dbo].[outertranv2]@ID BIGINT ,@UserID BIGINT ,@Name VARCHAR(50)
AS BEGIN TRAN     DECLARE @result INTEXEC @result = innertranv1 @ID =@ID, @UserID =@UserID, @Name = @NameIF ( @result <= 0 ) BEGINROLLBACK TRAN  ;                 RETURN ;END COMMIT TRAN    

我们执行父存储过程:

USE [TestDB]
GODECLARE    @return_value intEXEC    @return_value = [dbo].[outertranv2]@ID = 0,@UserID = 0,@Name = N'0'SELECT    'Return Value' = @return_valueGO

第一次提交正常,再次执行就会出现如下错误:

消息 266,级别 16,状态 2,过程 innertranv1,第 0EXECUTE 后的事务计数指示 BEGINCOMMIT 语句的数目不匹配。上一计数 = 1,当前计数 = 0。
消息 3903,级别 16,状态 1,过程 outertranv2,第 18ROLLBACK TRANSACTION 请求没有对应的 BEGIN TRANSACTION

如何解决?我们修改子存储过程如下:

USE [TestDB]
GO
/****** Object:  StoredProcedure [dbo].[innertran]    Script Date: 02/17/2013 16:26:26 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--内层事务存储过程,演示如何处理才能在嵌套的事务存储过程中正确处理事务
ALTER PROCEDURE [dbo].[innertran]@ID BIGINT ,@UserID BIGINT ,@Name VARCHAR(50)
AS BEGINDECLARE @TRANCOUNT int=(select @@TRANCOUNT)SET XACT_ABORT ONSET @TRANCOUNT=(select @@TRANCOUNT)PRINT '未进入子事务前全局@@TRANCOUNT'+CAST(@TRANCOUNT AS VARCHAR(50))    BEGIN TRAN tran1      --开始事务 SAVE TRAN tranpoint   --保存事务点SET @TRANCOUNT=(select @@TRANCOUNT)PRINT '进入子事务后全局@@TRANCOUNT'+CAST(@TRANCOUNT AS VARCHAR(50))    IF(EXISTS(SELECT TOP 1 * FROM dbo.test WHERE ID=@ID))    BEGINROLLBACK TRAN tranpoint ;   --回滚保存点的事务   COMMIT TRAN tran1 ;            --提示当前事务SET @TRANCOUNT=(select @@TRANCOUNT)  PRINT '回滚子事务后全局@@TRANCOUNT'+CAST(@TRANCOUNT AS VARCHAR(50))     RETURN 0 ;  END--业务逻辑开始INSERT  dbo.test( ID, UserID, Name)VALUES  ( @ID, @UserID,@Name  )--业务逻辑结束IF @@error <> 0 BEGIN  ROLLBACK TRAN tranpoint ; --回滚保存点的事务   COMMIT TRAN tran1 ;          --提示当前事务  SET @TRANCOUNT=(select @@TRANCOUNT)  PRINT '回滚子事务后全局@@TRANCOUNTT'+CAST(@TRANCOUNT AS VARCHAR(50))     RETURN 0;  END        COMMIT TRAN tran1 ;    SET XACT_ABORT OFF;    SET @TRANCOUNT=(select @@TRANCOUNT)  PRINT '提交子事务后全局@@TRANCOUNT'+CAST(@TRANCOUNT AS VARCHAR(50))RETURN 1 ;END

父过程如下: 

USE [TestDB]
GO
/****** Object:  StoredProcedure [dbo].[outertran]    Script Date: 02/17/2013 16:27:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        <Author,,Name>
-- Create date: <Create Date,,>
-- Description:    <外层存储过程>
-- =============================================
ALTER PROCEDURE [dbo].[outertran]@ID BIGINT,@UserID BIGINT,@Name VARCHAR(50)
AS DECLARE @TRANCOUNT int=(select @@TRANCOUNT)PRINT '未进入父事务前全局@@TRANCOUNT:'+CAST(@TRANCOUNT AS VARCHAR(50))BEGIN TRAN SET @TRANCOUNT=(select @@TRANCOUNT) PRINT '进入父事务后全局@@TRANCOUNT:'+CAST(@TRANCOUNT AS VARCHAR(50))    DECLARE @result INTEXEC @result = innertran @ID = @ID, @UserID = @UserID, @Name =@NameIF ( @result <= 0 ) BEGINROLLBACK TRAN  ;SET @TRANCOUNT=(select @@TRANCOUNT) PRINT '回滚父事务后全局@@TRANCOUNT:'+CAST(@TRANCOUNT AS VARCHAR(50)) RETURN ;END COMMIT TRAN SET @TRANCOUNT=(select @@TRANCOUNT) PRINT '提交父事务后全局@@TRANCOUNT:'+CAST(@TRANCOUNT AS VARCHAR(50))

调用父存储过程:

USE [TestDB]
GODECLARE    @return_value intEXEC    @return_value = [dbo].[outertran]@ID = 0,@UserID = 0,@Name = N'0'SELECT    'Return Value' = @return_valueGO

结果如下:

未进入父事务前全局@@TRANCOUNT:0
进入父事务后全局@@TRANCOUNT:1
未进入子事务前全局@@TRANCOUNT:1
进入子事务后全局@@TRANCOUNT:2
回滚子事务后全局@@TRANCOUNT:1
回滚父事务后全局@@TRANCOUNT:0

不会再报"EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配"之类的错误了,实际上就是在每个嵌套的子过程中标明当前事务点,每个子事务 只提交/回滚 子事务点,而不是回滚整个事务!

实际开发中还是会出现事务错乱的情况,如在try...catch...中

转载于:https://www.cnblogs.com/Richard2014/p/9935984.html

http://www.lbrq.cn/news/797185.html

相关文章:

  • 合肥高端网站建设设计/app推广拉新工作可靠吗
  • 模板建站seo优化/沧州网站seo
  • 金溪那里可以做网站/青岛seo经理
  • 基于工作过程的商务网站建设 网页制作/济南百度竞价代运营
  • 好的做问卷调查的网站好/网站友情链接是什么
  • app软件开发培训班/微信seo是什么意思
  • 网站备案需要去哪办理/广告投放网
  • 没有公司可以做网站吗/如何做网络推广运营
  • 网站建设php/哪个平台可以接推广任务
  • 小型网站建设/seo优化关键词排名
  • 宿迁做网站 宿迁网站建设/seo是什么职业做什么的
  • 网站建设创作思路怎么写/360竞价推广登录入口
  • 电子商务网站建设书籍/域名
  • 酒店网站建设描述/chrome浏览器
  • 上海品牌型网站建设靠谱/汕头网站建设公司
  • 公司网站怎么做才能吸引人/免费行情软件网站下载大全
  • 山东省环保厅官方网站建设项目/百度前三推广
  • 时时彩 网站开发/郑州网站制作公司哪家好
  • 网站建设的设备/杭州企业seo
  • 万网主机网站建设数据库怎么弄/seo排名优化教程
  • 数据库做网站/广东短视频seo搜索哪家好
  • 局网站建设进入前十名/有免费推广平台
  • c 网站开发 调试/seo排名的影响因素有哪些
  • 电子商务他们的代表网站/济南网站建设方案
  • 域名访问网站应该怎么做/seo专业技术培训
  • 做拍卖的网站有哪些/品牌宣传方式
  • 鲜花网站建设项目概述/衡阳有实力seo优化
  • 网页网站导读怎么做/太原seo公司
  • 常见c2c网站有哪些/谷歌sem服务商
  • 昆明做网站建设技巧公司/网络宣传渠道有哪些
  • JavaEE初阶第十三期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(十一)
  • 关于Web前端安全防御之内容安全策略(CSP)
  • 大语言模型涉及的一些概念(持续更新)
  • RAWINPUT避坑指南(涉及GetRawInputData/GetRawInputBuffer)
  • 前端与后端部署大冒险:Java、Go、C++三剑客
  • C++ 模板初阶