2

给定一个 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),但相同的非分布式事务版本可以完美运行?又可能有什么冲突?

4

2 回答 2

0

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

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

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

于 2012-08-18T18:37:14.607 回答
0

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

将步骤 2) 替换为

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

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

将步骤 2) 替换为

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

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

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

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

于 2012-08-18T18:55:47.803 回答