此操作与此事务上的另一个挂起操作冲突。此操作失败

悬崖跳舞被人砍 2017-03-03 04:43:53
我有一个需求,需要同步两台服务器上一模一样的两个表。
高实时性的要求与两台服务器可以互通的情况,让我想到了链接服务器+触发器的问题
要保证两边的表数据始终一致,需要在两边服务器上都建立链接服务器与触发器,这是要考虑避免两边触发器陷入循环的问题,于是我决定要在触发器1被触发时,关闭掉触发器2,更新操作结束后再开启触发器2.

我写的触发器1代码如下:
USE [EwellPortal]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER trigger [dbo].[TRG_UPDATE_SECURITY_CREDENTIAL]
on [dbo].[SECURITY_CREDENTIAL]
after update
as
set xact_abort on
--关闭192.168.144.170链接服务器上的触发器2
exec [192.168.144.170].[ewellportal].[dbo].PROC_CLOSE_TRG1
declare @CREDENTIAL_ID int
,@CREDENTIAL_VALUE varchar(254)
select @CREDENTIAL_ID = CREDENTIAL_ID
,@CREDENTIAL_VALUE = CREDENTIAL_VALUE
from inserted
BEGIN DISTRIBUTED TRANSACTION
update [192.168.144.170].EwellPortal.dbo.SECURITY_CREDENTIAL
set CREDENTIAL_VALUE = @CREDENTIAL_VALUE
where CREDENTIAL_ID = @CREDENTIAL_ID
COMMIT TRAN
exec [192.168.144.170].[ewellportal].[dbo].PROC_open_TRG1
--开启192.168.144.170链接服务器上的触发器2

--其中192.168.144.170上[PROC_CLOSE_TRG1]和[PROC_OPEN_TRG1]的存储过程代码分别如下:
create proc [dbo].[PROC_CLOSE_TRG1]
AS
ALTER TABLE SECURITY_CREDENTIAL disable trigger [TRG_UPDATE_SECURITY_CREDENTIAL]

create proc [dbo].[PROC_OPEN_TRG1]
AS
ALTER TABLE SECURITY_CREDENTIAL enable trigger [TRG_UPDATE_SECURITY_CREDENTIAL]

当我执行简单的更新操作时:
update security_credential
set [CREDENTIAL_VALUE] = '5Bg0yHTmgxD0WTTTcxv2IgmpYKc='
where [CREDENTIAL_ID] = 183

报错:“此操作与此事务上的另一个挂起操作冲突。此操作失败”
当我注释掉关闭触发器2的语句exec [192.168.144.170].[ewellportal].[dbo].PROC_CLOSE_TRG1语句时,又可以正常执行。
似乎是关闭192.168.144.170上的触发器2的操作,与更新192.168.144.170上的表的操作有冲突。
求教大神此问题的解决方法,如无,是否有其他的方法,可以满足该需求。
有位大神和我说使用sqlclr,奈何只是刚开始学习c#,恐时间代价过长
...全文
393 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 1 楼 timefile 的回复:
家里还有地吗?
不知道寡人你在说啥~
寡亾 2017-03-03
  • 打赏
  • 举报
回复
家里还有地吗?

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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