给定一个 SQL 脚本:
- 开始交易。它从服务器 X 启动
- 从涉及表 A 的查询中选择到表 B(= 新表)
- 将表 A 选择到表 C 中(= 新表)
- 犯罪。
没有错误发生。这还不是分布式事务,因为一切都发生在一台服务器上。
现在让我们说 3. 变成:
- 将表 A 选择到表 C 中,但表 C 在不同的服务器上(我必须这样做,
EXECUTE('SELECT * INTO ...') AT [remoteserver]
因为 FROM 子句中允许使用 3 前缀语法,但 INTO 子句中不允许使用)
现在 SQL Server 告诉我这条语句 (3) 与(现在分布式的)事务中的另一条语句产生了冲突。
为了向您展示错误来自哪里并证明分布式事务确实在我的设置上有效,我现在注释掉第 2 步)!
现在整个事情都起作用了。所以步骤 2) 使问题发生。但是步骤 2) 基本上只对表 A 和其他一些表进行连接选择以生成表 B,仅此而已。
为什么在这种情况下(在分布式事务版本中)不能顺利执行步骤 3),但相同的非分布式事务版本可以完美运行?又可能有什么冲突?