我使用了以下代码:
--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”,以适合每个事务的提交或回滚结束。我的问题是,重用名称是我问题的原因吗?重用名称是否会产生某种类型的冲突?
答案 0 :(得分:2)
BEGIN TRAN
不需要任何名称 - 名称是可选的。
然而,交易可以嵌套,如果你没有完成第一个交易,即使在其他交易完成后它仍然有效 - 如果你回滚它们,它们都会回滚。
可能发生的是您没有提交事务,因此以下事务是嵌套的。当事务回滚时(可能是由于超时),它们都会回滚。