关于链接服务器操作,急,请指教

三只蚂蚁2008 2006-02-27 09:43:57
请教大家,链接服务器的操作语句写在存储过程里为什么执行效率会很低呢,在查询分析器里的速度却很快?如何改进它的执行效率
如下所示:
(链接服务器已经建立,发下为调用)
-- =============================================
-- Author: babau
-- date: 2 006-2-21
-- Description: *********
-- =============================================
CREATE PROCEDURE [dbo].[cp_UsersInfo_AddItemOfBoxPwd]
@UserName varchar(20),
@LoginPwd varchar(50),
@BoxPwd varchar(14)

AS
IF NOT EXISTS(SELECT ID FROM Users WHERE UserName = @UserName)
RETURN -1 --无此用户

IF NOT EXISTS(SELECT ID FROM Users WHERE UserName = @UserName AND Password = @LoginPwd)
RETURN -2 --登陆密码不正确

--使用事务来控制程序的正常执行
BEGIN TRANSACTION AddBoxPwd

UPDATE [Server1].[login_fs2].[dbo].Login_tb SET box_password = @BoxPwd WHERE username = @UserName
IF(@@ROWCOUNT = 0)
BEGIN
GOTO ErrorHandler
END

UPDATE [Server2].[login_fs2].[dbo].Login_tb SET box_password = @BoxPwd WHERE username = @UserName
IF(@@ROWCOUNT = 0)
BEGIN
GOTO ErrorHandler
END

UPDATE [Server3].[login_fs2].[dbo].Login_tb SET box_password = @BoxPwd WHERE username = @UserName
IF(@@ROWCOUNT = 0)
BEGIN
GOTO ErrorHandler
END

UPDATE [Server4].[login_fs2].[dbo].Login_tb SET box_password = @BoxPwd WHERE username = @UserName
IF(@@ROWCOUNT = 0)
BEGIN
GOTO ErrorHandler
END


--结束事务
COMMIT TRANSACTION AddBoxPwd
RETURN 0

ErrorHandler:
--回滚事务
ROLLBACK TRANSACTION AddBoxPwd
RETURN -3 --数据异常
...全文
147 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangdehao 2006-02-27
  • 打赏
  • 举报
回复

---参考:

解决windows 2003+Sql2000中OLEDB分布式事务无法启动的解决方案
在开发分布式数据库软件时,经常碰到下面的错误:
服务器: 消息 7391,级别 16,状态 1,行 6
该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分
布式事务。
[OLE/DB provider returned message: 不能在指定的事务处理器中
获得新事务。]
---------------------------------------------------------------------------------------------
服务器: 消息 8520,级别 20,状态 1,行 8
内部 MSDTC 事务的提交失败: Result Code = 0x8004d019。

连接中断
---------------------------------------------------------------------------------------------

搜索了网上类似问题的解决方案,都建议采用下面的方法(方法一):
1、运行 regedt32,浏览至 HKEY_LOCAL_MACHINE oftware\Microsoft\MSDTC。
添加一个 DWORD 值 TurnOffRpcSecurity,值数据为 1。
2、重启MS DTC服务。
3、打开“管理工具”的“组件服务”。
a. 浏览至"启动管理工具"。 b. 选择"组件服务"。 c. 展开"组件服务"树,然后展开"我的电脑"。 d. 右键单击"我的电脑",然后选择"属性"。 在 MSDTC 选项卡中,确保选中了下列选项:
网络 DTC 访问 网络管理 网络事务XA 事务
另外,"DTC 登录帐户"一定要设置为"NT Authority\NetworkService"。4、重启MS DTC服务。
5、再次运行 regedt32,浏览至 HKEY_LOCAL_MACHINE oftware\Microsoft\MSDTC,然后删除 TurnOffRpcSecurity 项。

但是实际上该方法基本上解决不了问题,经过长时间的反复实践,我终于按下面的方法解决了:
(方法二)
1、按照方法一的方法处理一遍,如果不行,再继续下面的方法
2、安装windows 2003 sp1,安装好后,方法一中的第4步设置对话框和原来不一样了,选择“事务管理通讯”中的“不要求验证”
3、最好安装好MDAC2.8

4、安装netbios协议
5、通过查找,在C:找到名为“hosts”的文件(没有扩展名),通常路径为C:\WINDOWS\system32\drivers\etc,将对方服务器的IP和计算机对应起来,参考如下:
==========================================================================================
# Copyright (c) 1993-1999 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
# 102.54.94.97 rhino.acme.com # source server
# 38.25.63.10 x.acme.com # x client host

127.0.0.1 localhost
192.168.1.2 中心
192.168.1.3 西站
192.168.106.35 信息中心2
==============================================================================================
三只蚂蚁2008 2006-02-27
  • 打赏
  • 举报
回复
报错行数对应最开始列出语句为:
UPDATE [Server2].[login_fs2].[dbo].Login_tb SET box_password = @BoxPwd WHERE username = @UserName
三只蚂蚁2008 2006-02-27
  • 打赏
  • 举报
回复
把事务语句改正后出现的问题如下:

(所影响的行数为 1 行)

服务器: 消息 7391,级别 16,状态 1,过程 cp_UsersInfo_AddItemOfBoxPwd_backup,行 30
该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务。
[OLE/DB provider returned message: 新事务不能登记到指定的事务处理器中。 ]
OLE DB 错误跟踪[OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a]。
三只蚂蚁2008 2006-02-27
  • 打赏
  • 举报
回复
error:
该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务。
[OLE/DB provider returned message: 新事务不能登记到指定的事务处理器中。 ]
OLE DB 错误跟踪[OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a]。
wangdehao 2006-02-27
  • 打赏
  • 举报
回复
BEGIN TRANSACTION
标记一个显式本地事务的起始点。
---而这个过程是一个分布式事务
wangdehao 2006-02-27
  • 打赏
  • 举报
回复
BEGIN TRANSACTION AddBoxPwd
改成: BEGIN DISTRIBUTED TRANSACTION
指定一个由 Microsoft 分布式事务处理协调器 (MS DTC) 管理的 Transact-SQL 分布式事务的起始。
todouwang 2006-02-27
  • 打赏
  • 举报
回复
set xact_abort on放在存储过程的开始,
现在的错误提示是什么?
三只蚂蚁2008 2006-02-27
  • 打赏
  • 举报
回复
在出现该提示时也用过了set xact_abort_on,但没有用
wangdehao 2006-02-27
  • 打赏
  • 举报
回复
先set xact_abort on

当 SET XACT_ABORT 为 ON 时,如果 Transact-SQL 语句产生运行时错误,整个事务将终止并回滚。

对于大多数 OLE DB 提供程序(包括 SQL Server),隐性或显式事务中的数据修改语句必须将 XACT_ABORT 设置为 ON。唯一不需要该选项的情况是提供程序支持嵌套事务时
三只蚂蚁2008 2006-02-27
  • 打赏
  • 举报
回复
MSDTC已经启动了
三只蚂蚁2008 2006-02-27
  • 打赏
  • 举报
回复
接上,执行以上的存储过程时出现如下问题:

无法为 OLE DB 提供程序 'SQLOLEDB' 启动嵌套事务。
之所以需要嵌套事务是因为 XACT_ABORT 选项已设置为 OFF。
[OLE/DB provider returned message: 无法在此会话中启动更多的事务。]
OLE DB 错误跟踪[OLE/DB Provider 'SQLOLEDB' ITransactionLocal::StartTransaction returned 0x8004d013: ISOLEVEL=4096]。

请问如何解决呢???急呀

27,581

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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