关于事务方面的一些疑问

qq_30412191 2020-08-04 01:36:28
消息 6401,级别 16,状态 1,过程 PRO_DAM_BGY_WDGL_BODY,第 152 行
无法回滚 TRANS。找不到该名称的事务或保存点。
消息 266,级别 16,状态 2,过程 PRO_DAM_BGY_WDGL_BODY,第 0 行
EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配。上一计数 = 4,当前计数 = 5。

--------我有两个表的新增分别是两个存储,里面分别有基本的check逻辑,我又写了PRO_DAM_BGY_WDGL_BODY,对两张表新增,
希望通过事务的方式保持一致性,结果报错,有人能提供下具体思路吗
BEGIN 


SET @P_APPLY_NO = '';
SET @P_OUT_MSG = '';
--1、@P_COMPANY_CODE(归属企业十位代码)+@P_RELATION_COMPANY_CODE(关系企业十位代码)+@P_FILE_TYPE查询单证类型,判断其是否存在
--1.1 如果不存在,直接RETURN,不用报错,对方可能文件比我们多,如果我们没有配置,表示我们不需要,不需要的文件,我们不报错,不处理就好。
IF NOT EXISTS(
SELECT 1 FROM dbo.DAM_BGD_FILE_TYPE WHERE COMPANY_CODE=@P_COMPANY_CODE AND RELATION_COMPANY_CODE=@P_RELATION_COMPANY_CODE
AND PAGE_TYPE='FILE_TYPE'
AND TYPE=@P_FILE_TYPE
)
BEGIN
RETURN ;
END
--2、@P_COMPANY_CODE(归属企业十位代码)+@P_RELATION_COMPANY_CODE(关系企业十位代码)+@P_FILE_TYPE查询命名规则,判断其是否存在
--2.1 如果存在,记录好 前缀、后缀、连接符,供后面使用。
--2.2 如果不存在,报错退出。
IF NOT EXISTS(
SELECT 1 FROM dbo.DAM_BGD_FILE_TYPE WHERE COMPANY_CODE=@P_COMPANY_CODE AND RELATION_COMPANY_CODE=@P_RELATION_COMPANY_CODE
AND PAGE_TYPE='FILE_NAME'
AND TYPE=@P_FILE_TYPE
)
BEGIN
SET @P_OUT_MSG='不存在命名规则';
RETURN
END

BEGIN TRY
BEGIN TRAN TRANS

SELECT @V_APPLY_NO=APPLY_NO,@V_HEAD_GUID=GUID FROM dbo.DAM_BGD_INFO
WHERE COMPANY_CODE=@P_COMPANY_CODE
AND RELATION_COMPANY_CODE=@P_RELATION_COMPANY_CODE
AND ENTRY_ID=@P_ENTRY_ID
IF ISNULL(@V_HEAD_GUID,'') = '' ---说明没有数据,新增表头
BEGIN
EXEC dbo.PRO_DAM_BGH_INSERT_WDGL_HEAD @P_COMPANY_CODE = @P_COMPANY_CODE, -- varchar(20)
@P_I_E = @P_I_E, -- varchar(5)
@P_M_P = @P_M_P, -- varchar(5)
@P_D_DATE = @P_D_DATE, -- varchar(100)
@P_BOND_INVT_NO =@P_BOND_INVT_NO, -- varchar(50)
@P_ENTRY_ID = @P_ENTRY_ID, -- varchar(18)
@P_DEFAULT_BIZ_TYPE = @P_DEFAULT_BIZ_TYPE, -- varchar(50)
@P_CONTROL_NO =@P_CONTROL_NO, -- varchar(255)
@P_CONTRACT_NO =@P_CONTRACT_NO, -- varchar(255)
@P_RELATION_COMPANY_CODE = @P_RELATION_COMPANY_CODE, -- varchar(36)
@P_DCLCUS_FLAG = '', -- varchar(1)
@P_DCLCUS_TYPECD = '', -- varchar(25)
@P_USER_NO = '', -- varchar(50)
@P_APPLY_NO = @P_APPLY_NO OUTPUT, -- varchar(50)
@P_OUT_MSG = @P_OUT_MSG OUTPUT, -- varchar(500)
@P_OUT_LOG = @P_OUT_LOG OUTPUT -- varchar(1000)
IF ISNULL(@P_APPLY_NO,'')=''
BEGIN
RAISERROR ('Error raised in TRY block.', -- Message text.
16, -- Severity.
1 -- State.
);
END
END


IF ISNULL(@P_DEFAULT_BIZ_TYPE,'')=''
BEGIN
SET @P_DEFAULT_BIZ_TYPE='ENTRY_ID';
END
EXECUTE dbo.PRO_DAM_INSERT_WDGL_DETAIL @P_APPLY_NO = @P_APPLY_NO, -- varchar(50)
@P_FILE_TYPE = @P_FILE_TYPE, -- varchar(20)
@P_FILE_PATH = @P_FILE_PATH, -- varchar(255)
@P_FILE_EXT = @P_FILE_EXT, -- varchar(10)
@P_BIZ_TYPE = @P_DEFAULT_BIZ_TYPE, -- varchar(36) ---默认关联单类型
@P_FILE_SOURCE = '', -- varchar(50)
@P_FILE_SIZE = @P_FILE_SIZE, -- float
@P_FILE_NO = '', -- varchar(50)
@P_OUT_FILE_PATH=@P_WDGL_FILE_PATH OUTPUT,
@P_OUT_MSG = @P_OUT_MSG OUTPUT -- varchar(500)
IF ISNULL(@P_OUT_MSG,'')<>''
BEGIN

RAISERROR ('Error raised in TRY block.', -- Message text.
16, -- Severity.
1 -- State.
);
END

EXECUTE dbo.PRO_DAM_BGY_CHECK_AND_INSERT_SEND_TASK
@P_APPLY_NO=@P_APPLY_NO,
@P_OUT_MSG = @P_OUT_MSG OUTPUT -- varchar(500)

END TRY
BEGIN CATCH
IF ISNULL(@P_OUT_MSG,'')=''
BEGIN
---说明没有错误--
COMMIT TRANSACTION TRANS
END
ELSE
BEGIN
---///-----------
ROLLBACK TRANSACTION TRANS
END
END CATCH;
END
,这是具体存储求来个大佬看一下
...全文
91 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2020-08-05
  • 打赏
  • 举报
回复
你的代码太长,不多看了,说关键的吧: commit 提交,应该在End Try 之前。 rollback 应该在 Catch 中间。 这个很好理解呀——有了问题的才进 catch, 没问题的进去干什么?
shoppo0505 2020-08-05
  • 打赏
  • 举报
回复
begin是开启事务,end是终结事务。 你自己数数看,begin和end是否数量一下。
qq_30412191 2020-08-04
  • 打赏
  • 举报
回复
希望大佬们能教一下小弟

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧