挑战高手!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,因此如果该表被死锁,其他存储器都要失败。既然回滚了,为什么还存在锁定表的现象?
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,因此如果该表被死锁,其他存储器都要失败。既然回滚了,为什么还存在锁定表的现象?
...全文
相关推荐
Oracle数据库导入到SqlServer步骤(图文篇)
Step 21-22: 最后一步最后,从 Oracle 导入数据到 Sql Server 成功结束。知识点总结:1. Oracle 数据库到 SqlServer 数据迁移需要经过多个步骤。2.
MSSQL与Oracle做数据迁移
MSSQL与Oracle数据迁移在企业信息化建设中,数据迁移是一项繁锁而又单调的工作。面对各种各样的基础数据,定制开发数据迁移工具往往费时费力,切不通用。那么到底什么工具能够胜任我们的工作呢?
Java使用JDBC连接Oracle_MSSQL实例代码
例如,Oracle的连接URL为 `"jdbc:oracle:thin:@<hostname>:<port>:<service_name>"`,而MSSQL的连接URL为 `"jdbc:sqlserver
mssql数据库和oracle数据库通过触发器实现数据表同步
**测试数据同步**: - 在MSSQL中对源表进行增删改操作,并观察Oracle表中的变化,确保数据同步正确无误。
Sqlserver、Oracle、MySql、PostgreSql、SqlLite数据库差异
### 数据库间的差异详解#### 一、表名与列名区分大小写- **Sqlserver**: 不区分大小写,并且在使用时需保持与原始声明一致。


疑难问题
