2013-01-03 43 views
0

我用下面的代码:Begin Tran每次都需要一个新名字吗?

--begin tran redist1 
/*--FIRST Update 
update db..tablename set column=value 
where complexthing = othercomplexthing 
*/ 
/*--SECOND Update 
update db..tablename set column=replace(column,'A','1') 
*/ 
select * from db..tablename 
--rollback tran redist1 
--commit tran redist1 

我强调“的begin tran redist1”,开船,强调的第一大更新语句,并运行它,然后做与SELECT语句相同。它起作用了,所以我突出显示了“commit tran redist1”。

接下来我突出显示“begin tran redist1”,运行它,突出显示SECOND更新语句并运行它,然后对select语句执行相同的操作。它没有工作,所以我突出了“rollback tran redist1”。

接下来我突出显示“begin tran redist1”,运行它,突出显示SECOND更新语句并运行它,然后对select语句执行相同的操作。它这次工作,所以我突出显示“commit tran redist1”。

我用了几个更新语句,每次都重复这个过程。然后,我打开了一个“编辑”窗口,在我最后一次“提交”之后直接更改值,但SQL服务器仅为该窗口保持超时,并说我的“commit tran redist1”是阻塞事务,尽管已完成。我再次运行提交,并打开编辑窗口,显示数据,因为我改变了它。

今天早上,我再次打开了编辑窗口,并且在我运行FIRST查询+提交后,表格又回到了某种程度。所有后来的查询+提交都丢失了。但是,我在编辑窗口中手动编辑的记录仍然被编辑。

请注意,每次我使用名称“redist1”,以每次事务的适当提交或回滚结束。我的问题是,是否重用名称是我问题的原因?名称的重用会造成某种类型的冲突吗?

回答

2

BEGIN TRAN不需要任何名称 - 名称是可选的。

但是,交易可以嵌套,如果您没有完成第一个交易,即使其他交易完成后它仍然有效 - 如果您将其回滚,它们将全部回滚。

可能发生的情况是您没有提交事务,因此以下事务是嵌套的。当事务回滚(可能由于超时)时,它们全部回滚。

+0

+1,我不认为我曾经使用过一个命名事务。我一直都在失败时回滚一切。 –

+0

我对提交/回滚非常有条不紊,所以我肯定你所描述的意外嵌套没有发生。我测试后立即承诺或回滚,以确保我没有失去任何东西。每个说“成功完成”。 – Merennulli

+0

@Merennulli - 可能。从您的描述中可能发现人为错误。 – Oded

相关问题