SQL Server:分布式事务冲突

时间:2012-08-18 17:57:08

标签: sql-server distributed-transactions

给定一个SQL脚本:

  1. 开始交易。它是从服务器X
  2. 启动的
  3. 从包含表A的查询到表B(=新表)
  4. 进行选择
  5. 将表A选入表C(=新表)
  6. 提交。
  7. 没有错误发生。这不是分布式事务,因为一切都发生在1台服务器上。

    现在让我们说3.成为:

    1. 在表C中选择表A,但表C在不同的服务器上(我必须通过EXECUTE('SELECT * INTO ...') AT [remoteserver]执行此操作,因为在FROM子句中允许使用3前缀语法,但在INTO子句中不允许这样做)
    2. 现在SQL Server告诉我这个语句(3)与(现在分发的)事务中的另一个语句产生冲突。

      向您展示错误的来源,并证明分布式交易确实可以在我的设置上运行我现在注释掉第2步

      现在整个事情都有效。因此,步骤2)使问题发生。但是步骤2)基本上只对表A和其他一些表进行连接选择以生成表B而不是其他任何内容。

      为什么步骤3不能在没有问题的情况下执行(在分布式事务版本中),但同样的非分布式事务版本可以正常运行?可能会发生什么冲突?

2 个答案:

答案 0 :(得分:0)

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

  1. 开始交易
  2. 运行查询2(或3)
  3. 可以在视图sys.dm_tran_locks中找到锁。
  4. 回滚或提交,无所谓
  5. 也许您可以将结果锁附加到您的问题中?

答案 1 :(得分:0)

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

替换步骤2)
2) Create Table A **with** a primary key.

现在非分布式版本可以使用,分布式版本可以(步骤3)。

替换步骤2)
2) Create Table A with **no** primary key

现在两个版本都运行良好。

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

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