挑战高手!SqlServer中操作Oracle数据:事物完整性的保持?

dgcat_6 dgcat_6 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
为了问题的描述,模拟环境:
SqlServer中,A库建了一个表EMP,和Oralce中Scott用户表Emp结构一致。
建立存储过程如下:
ALTER PROCEDURE TEST
AS
BEGIN
SET XACT_ABORT ON

declare @errors int
select @errors=0

BEGIN DISTRIBUTED TRANSACTION
--ORACLE 表更新操作
UPDATE LinkOraDB..SCOTT.EMP SET ENAME='Smith' WHERE EMPNO='7369'
select @errors=@errors+@@error

--SQLSERVER表操作
--将超过ENAME字段长度的内容付给它,引起错误。测试事物是否完整。
UPDATE A..EMP SET ENAME='SmithSmithSmith' WHERE EMPNO='7369'
select @errors=@errors+@@error

if @errors=0
begin
commit transaction
return 0--成功
end
else
begin
rollback transaction
return -1--失败
end
end

执行:
EXECUTE A..TEST
第一次成功,表没有修改
马上再执行一次,出错:
务器: 消息 7399,级别 16,状态 1,过程 TEST,行 13
OLE DB 提供程序 'MSDAORA' 报错。
[OLE/DB provider returned message: ORA-00060: 等待资源时检测到死锁
]

请问:为什么会这样?由于还有其他存储器访问SCOTT.EMP,因此如果该表被死锁,其他存储器都要失败。既然回滚了,为什么还存在锁定表的现象?
...全文
评论 13
收藏 已收藏
分享
返回顶部
dgcat_6
疑难问题 22,298 成员 121,727 内容