Sql server SQL Server:分布式事务冲突

Sql server SQL Server:分布式事务冲突,sql-server,distributed-transactions,Sql Server,Distributed Transactions,给定一个SQL脚本: 开始一项交易。它是从服务器X启动的 从涉及表a的查询中选择到表B(=新表) 将表A选择到表C(=新表) 承诺 没有错误发生。这还不是一个分布式事务,因为一切都发生在一台服务器上 现在让我们说3。变成: 将表A选择到表C中,但表C位于不同的服务器上(我必须通过[remoteserver]上的EXECUTE('Select*into…')执行此操作,因为FROM子句中允许使用3前缀语法,但into子句中不允许使用) 现在SQL Server告诉我,此语句(3)与(现在已分发)事

给定一个SQL脚本:

  • 开始一项交易。它是从服务器X启动的
  • 从涉及表a的查询中选择到表B(=新表)
  • 将表A选择到表C(=新表)
  • 承诺
  • 没有错误发生。这还不是一个分布式事务,因为一切都发生在一台服务器上

    现在让我们说3。变成:

  • 将表A选择到表C中,但表C位于不同的服务器上(我必须通过[remoteserver]上的
    EXECUTE('Select*into…')执行此操作,因为FROM子句中允许使用3前缀语法,但into子句中不允许使用)
  • 现在SQL Server告诉我,此语句(3)与(现在已分发)事务中的另一个语句产生冲突

    为了向您展示错误的来源,并证明分布式事务确实可以在我的设置中工作我现在注释掉步骤2)

    现在整件事都成功了。因此,步骤2)使问题发生。但步骤2)基本上只对表a和其他一些表执行联接选择以生成表B,而不执行其他操作


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

    看起来查询2和查询3不兼容。要找出原因,请调查每个查询导致的锁。一种方法是:

  • 开始交易
  • 运行查询2(或3)
  • 可以在视图
    sys.dm\u tran\u Locks
    中找到锁
  • 回滚或提交,无所谓

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

    看起来查询2和查询3不兼容。要找出原因,请调查每个查询导致的锁。一种方法是:

  • 开始交易
  • 运行查询2(或3)
  • 可以在视图
    sys.dm\u tran\u Locks
    中找到锁
  • 回滚或提交,无所谓

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

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

    将步骤2)替换为

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

    将步骤2)替换为

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

    但是我真的不在乎,因为当我在事务之前创建带有主键的表时,整个过程也会起作用。只是在事务中使用CREATETABLE语句创建主键会导致分布式版本无法工作


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

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

    将步骤2)替换为

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

    将步骤2)替换为

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

    但是我真的不在乎,因为当我在事务之前创建带有主键的表时,整个过程也会起作用。只是在事务中使用CREATETABLE语句创建主键会导致分布式版本无法工作


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

    谢谢你的回答,我还以为这也与锁有关,现在不太确定。至少我现在有办法解决真正的问题。在我自己对我最初发帖的回答中了解原因。如果你对主键引起的真正问题有一个答案,请也回答这个问题,因为我很感兴趣。谢谢。谢谢你的回答,我还以为这也和锁有关,现在不太确定了。至少我现在有办法解决真正的问题。在我自己对我最初发帖的回答中了解原因。如果你对主键引起的真正问题有一个答案,请也回答这个问题,因为我很感兴趣。谢谢。在您提交之前,该表仅对其自身的连接可见。不允许对第二个连接进行操作。在您提交之前,该表仅对其自己的连接可见。第二个连接不允许在其上操作。
    2) Create Table A **with** a primary key.
    
    2) Create Table A with **no** primary key