挑战高手!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,因此如果该表被死锁,其他存储器都要失败。既然回滚了,为什么还存在锁定表的现象?
...全文
17 13 点赞 打赏 收藏 举报
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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
  • 打赏
  • 举报
回复
相关推荐
发帖
疑难问题
加入

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2003-12-15 02:28
社区公告
暂无公告