挑战高手!SqlServer中操作Oracle数据:事物完整性的保持?
为了问题的描述,模拟环境:
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,因此如果该表被死锁,其他存储器都要失败。既然回滚了,为什么还存在锁定表的现象?