SQL Server - 两个DB上的非分布式事务

时间:2013-12-11 19:19:11

标签: sql sql-server transactions


我正在尝试本地化我遇到的问题 有2个DB及其交易行为。

我在一个SQL Server 2008 R2实例上创建了两个DB。

TEST1
TEST2

test1有一个表Table_1
test2有一个表Table_2

两个表都有一个ID(int)和一个value(string)列 两者都只有一行ID = 1

然后在SQL Server Management Studio中,
在某个窗口1我做了

use test1

begin transaction

update test1.dbo.Table_1
set
value = 'TEST-100'
where
ID = 1 


update test2.dbo.Table_2
set
value = 'TEST-200'
where
ID = 1 

commit transaction  --- but I don’t run the commit yet --- 

然后在另一个窗口2中,我做了

select * From test1.dbo.Table_1
with (nolock) 

select * From test2.dbo.Table_2
with (nolock) 

这样我可以看到两个未提交的值。

但如果在窗口2中,我确实

select * From test1.dbo.Table_1


select * From test2.dbo.Table_2

这些SELECT状态挂起。

所以我的问题是:是来自的交易 窗口1,跨越两个DB?似乎是因为

select * From test2.dbo.Table_2

也挂起,这对我来说意味着test2.dbo.Table_2
我参加了同一笔交易 在窗口1中
但为什么这笔交易就像一个分布式交易呢? 这是正常的吗?解释是什么?那是一些 SQL Server中的未归位功能?有没有 可以解释我所看到的行为的参考文献?

1 个答案:

答案 0 :(得分:1)

当查询跨越2个数据库时,您的事务将提升为由MSDTC处理的分布式事务。这是正常的方式,它发生时没有明确使用BEGIN DISTRIBUTED TRANSACTION语句。