none
关于SQL中通过链接服务器执行分布式事务过程时只能查询不能执行insert update delete等操作,请问如何解决此问题,谢谢! RRS feed

  • 问题

  • 各位好,我们在应用中需要从一台数据库去访问另一台数据库中表和过程。通过SQLNCLI方式建了链接服务器,正常测试访问都正常,但在执行分布式事务update表时,却报错:

    链接服务器"srv_lnk_UNION"的 OLE DB 访问接口 "SQLNCLI" 返回了消息 "没有活动事务。"。
    消息 7391,级别 16,状态 2,第 3 行
    无法执行该操作,因为链接服务器 "srv_lnk_UNION" 的 OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务。。

    但能正常的执行select执行,这个情况如何解决。

    以下是链接服务器的SQL

    /****** 对象:  LinkedServer [srv_lnk_UNION]    脚本日期: 09/25/2010 16:01:48 ******/
    EXEC master.dbo.sp_addlinkedserver @server = N'srv_lnk_UNION', @srvproduct=N'10.66.79.140', @provider=N'SQLNCLI', @datasrc=N'10.66.79.140'
     /* For security reasons the linked server remote logins password is changed with ######## */
    EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'srv_lnk_UNION',@useself=N'False',@locallogin=NULL,@rmtuser=N'union',@rmtpassword='########'

    GO
    EXEC master.dbo.sp_serveroption @server=N'srv_lnk_UNION', @optname=N'collation compatible', @optvalue=N'false'
    GO
    EXEC master.dbo.sp_serveroption @server=N'srv_lnk_UNION', @optname=N'data access', @optvalue=N'true'
    GO
    EXEC master.dbo.sp_serveroption @server=N'srv_lnk_UNION', @optname=N'dist', @optvalue=N'false'
    GO
    EXEC master.dbo.sp_serveroption @server=N'srv_lnk_UNION', @optname=N'pub', @optvalue=N'false'
    GO
    EXEC master.dbo.sp_serveroption @server=N'srv_lnk_UNION', @optname=N'rpc', @optvalue=N'true'
    GO
    EXEC master.dbo.sp_serveroption @server=N'srv_lnk_UNION', @optname=N'rpc out', @optvalue=N'true'
    GO
    EXEC master.dbo.sp_serveroption @server=N'srv_lnk_UNION', @optname=N'sub', @optvalue=N'false'
    GO
    EXEC master.dbo.sp_serveroption @server=N'srv_lnk_UNION', @optname=N'connect timeout', @optvalue=N'0'
    GO
    EXEC master.dbo.sp_serveroption @server=N'srv_lnk_UNION', @optname=N'collation name', @optvalue=null
    GO
    EXEC master.dbo.sp_serveroption @server=N'srv_lnk_UNION', @optname=N'lazy schema validation', @optvalue=N'false'
    GO
    EXEC master.dbo.sp_serveroption @server=N'srv_lnk_UNION', @optname=N'query timeout', @optvalue=N'0'
    GO
    EXEC master.dbo.sp_serveroption @server=N'srv_lnk_UNION', @optname=N'use remote collation', @optvalue=N'true'

     


    rickroot
    2010年9月25日 8:12

全部回复

  • 记得以前可以在连接服务器中使用DML语句,但是一次不能操作太多数据.

    是使用openquery函数实现.

     

    详情见:

    http://technet.microsoft.com/zh-cn/library/ms188427.aspx

     

    但是我记得好像我当时不是这种写法.


    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    2010年9月25日 16:07
  • Is msdtc running on all involved servers? Did you enable network access in msdtc?
    2010年9月25日 17:58
  • msdtc 是在相关的服务器上都是运行了的,也激活了网络访问的,因为我已经能用msdtc进行数据的查询操作了,只是不能进行修改操作。
    rickroot
    2010年9月26日 1:11
  • 直接执行远程的存储过程,存储过程里面含有update语句,这一类的操作能成功吗?
    2010年9月26日 1:49
    版主
  • 如果直接通过连接服务器执行update语句是正常的,能成功,但如果把update放到一个事务中,就执行不了,感觉像是分布式事务没法修改,只能在事务中使用查询语句。
    rickroot
    2010年9月26日 1:53
  • 检查下“Require distributed transactions for server-to-server communication”是否启用
    2010年9月26日 2:03
    版主
  • 这个是在哪里检查,组件服务里的MSDTC中?还是哪里?能详细说一下吗?我前面能在事务中使用select语句 不能说明我启动了分布式事务吗?
    rickroot
    2010年9月26日 2:06
  • Select from linked server is not always in distributed transaction. And check dtc setting in linked server properties -> server options.
    2010年9月26日 2:41
  • 即使我使用如下语句 select 也不是在分布式事务中吗?

    SET xact_abort ON
    BEGIN  TRANSACTION
    select * from tables

    COMMIT TRAN
    GO


    rickroot
    2010年9月26日 2:44
  • It runs on local server only.
    2010年9月26日 2:46
  • SET xact_abort ON
    BEGIN  TRANSACTION
    select * from [lnkserver].database.dbo.tables

    COMMIT TRAN
    GO

    不好意思,刚刚输入少了,那这条语句是在分布式事务中运行吗?


    rickroot
    2010年9月26日 2:49