【问题标题】:SQL Server : distributed transaction conflictSQL Server:分布式事务冲突
【发布时间】:2012-08-14 19:06:06
【问题描述】:

给定一个 SQL 脚本:

  1. 开始事务。它从服务器 X 启动
  2. 从涉及表 A 的查询中选择到表 B(= 新表)
  3. 将表 A 选择到表 C 中(= 新表)
  4. 提交。

没有错误发生。这还不是分布式事务,因为一切都发生在一台服务器上。

现在让我们说 3. 变成:

  1. 将表 A 选择到表 C 中,但表 C 在不同的服务器上(我必须通过 EXECUTE('SELECT * INTO ...') AT [remoteserver] 执行此操作,因为 FROM 子句中允许使用 3 前缀语法,但 INTO 子句中不允许使用)

现在 SQL Server 告诉我这条语句 (3) 与(现在已分发的)事务中的另一条语句产生了冲突。

为了向您展示错误的来源并证明分布式事务确实在我的设置上有效我现在注释掉第 2 步)!

现在一切正常。所以步骤 2) 使问题发生。但是第 2 步)基本上只对表 A 和其他一些表进行连接选择以生成表 B,仅此而已。

为什么不能在这种情况下(在分布式事务版本中)执行步骤 3)而没有问题,但相同的非分布式事务版本可以完美运行?又可能有什么冲突?

【问题讨论】:

    标签: sql-server distributed-transactions


    【解决方案1】:

    好的,伙计们。发现了问题,很有意思。那是另外一回事。我确实没有提到我还创建了表 A,因为我认为它与问题无关,所以:

    将步骤 2) 替换为

    2) Create Table A **with** a primary key.
    

    现在非分布式版本可以工作,分布式版本不(即第 3 步)。

    将步骤 2) 替换为

    2) Create Table A with **no** primary key
    

    现在两个版本都可以正常工作。

    但我真的不在乎,因为当我在事务之前的某处使用主键创建表时,整个事情也有效.只是使用create table语句创建主键in事务导致3)分布式版本不起作用。

    如果有人知道为什么,请写在这里:)

    【讨论】:

    • 在您提交之前,该表仅对其自己的连接可见。不允许第二个连接对其进行操作。
    【解决方案2】:

    查询 2 和查询 3 似乎不兼容。要找出原因,请调查每个查询导致哪些锁定。一种方法是:

    1. 开始交易
    2. 运行查询 2(或 3)
    3. 可以在 sys.dm_tran_locks 视图中找到锁。
    4. 回滚或提交,无所谓

    也许您可以将生成的锁附加到您的问题中?

    【讨论】:

    • 谢谢你的回答,我还以为跟锁有关系,现在不太确定了。至少我现在有解决真正问题的方法。在我自己对我最初发帖的回答中了解原因。如果您对主键引起的真正问题有答案,请也对此做出回应,因为它让我感兴趣。谢谢。
    猜你喜欢
    • 2015-10-04
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多