Begin Tran每次都需要一个新名字吗?

时间:2013-01-03 15:56:32

标签: sql-server transactions

我使用了以下代码:

--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”,运行它,突出显示FIRST更新语句并运行它,然后对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”,以适合每个事务的提交或回滚结束。我的问题是,重用名称是我问题的原因吗?重用名称是否会产生某种类型的冲突?

1 个答案:

答案 0 :(得分:2)

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

然而,交易可以嵌套,如果你没有完成第一个交易,即使在其他交易完成后它仍然有效 - 如果你回滚它们,它们都会回滚。

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