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

dgcat_6 2003-12-15 02:28:14
为了问题的描述,模拟环境:
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,因此如果该表被死锁,其他存储器都要失败。既然回滚了,为什么还存在锁定表的现象?
...全文
54 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
dgcat_6 2003-12-22
  • 打赏
  • 举报
回复
问题没有得到解决,但还是非常感谢邹建。结帐
liyw120 2003-12-16
  • 打赏
  • 举报
回复
请高手指教想做程序员应先从何学起?
zjcxc 2003-12-15
  • 打赏
  • 举报
回复
试试,用你原来的,改:
SET XACT_ABORT ON

为:
SET XACT_ABORT Off
dgcat_6 2003-12-15
  • 打赏
  • 举报
回复
没有人可以帮我吗?
http://www.dbforums.com/showthread.php?threadid=925213&highlight=BEGIN+DISTRIBUTED+TRANSACTION

这篇文章好象可以解决问题,但我还未能消化。邹,帮忙看看?
dgcat_6 2003-12-15
  • 打赏
  • 举报
回复
哈哈,我们可以互相帮忙。
编译通过,但两次执行,结果和我提出问题一样。看来还得继续
zjcxc 2003-12-15
  • 打赏
  • 举报
回复
上面的已经改好啦.

我相反,对oracle不熟.呵呵
dgcat_6 2003-12-15
  • 打赏
  • 举报
回复
我对SQL SERVER不熟悉,但为了和ORACLE实时交换数据,也免为其难了。希望有朋友能帮下忙
zjcxc 2003-12-15
  • 打赏
  • 举报
回复
--在:

--没注意,多了一个begin,这下应该没问题了.
ALTER PROCEDURE TEST
AS
SET XACT_ABORT ON
BEGIN DISTRIBUTED TRANSACTION
--ORACLE 表更新操作
UPDATE LinkOraDB..SCOTT.EMP SET ENAME='Smith' WHERE EMPNO='7369'

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

commit TRANSACTION
go
dgcat_6 2003-12-15
  • 打赏
  • 举报
回复
编译不能通过,错误在“commit transaction”语句!
你在线吗?我想和你讨论下
zjcxc 2003-12-15
  • 打赏
  • 举报
回复
--这个应该就可以了.
ALTER PROCEDURE TEST
AS
BEGIN
SET XACT_ABORT ON

declare @errors int
select @errors=-1

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

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

commit transaction
go
zjcxc 2003-12-15
  • 打赏
  • 举报
回复
你不说我倒忘了.问题出在这句上:

SET XACT_ABORT ON

用了这句后,一出错,事务就已经回滚了.去掉这句应该就没问题了.
dgcat_6 2003-12-15
  • 打赏
  • 举报
回复
TO:zjcxc(邹建)
谢谢你,我发的几个帖子都有你的参与。你这样改,实质不大。第一条Update语句肯定执行,当执行第二条UPDATE语句时,肯定失败,因此执行Rollback语句。SQLSERVER回滚了,但ORACLE似乎没有回滚,不然第二次执行时不会报错误:
LE DB 提供程序 'MSDAORA' 报错。
[OLE/DB provider returned message: ORA-00060: 等待资源时检测到死锁]
解决的办法,是不是有什么显示的语句要求ORACLE 回滚了?
zjcxc 2003-12-15
  • 打赏
  • 举报
回复
--试试改为:
ALTER PROCEDURE TEST
AS
SET XACT_ABORT ON

BEGIN DISTRIBUTED TRANSACTION
--ORACLE 表更新操作
UPDATE LinkOraDB..SCOTT.EMP SET ENAME='Smith' WHERE EMPNO='7369'
if @@error <>0 goto lb_err

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

commit transaction
return 0--成功
lb_err:
rollback transaction
return -1--失败
go

22,300

社区成员

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

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