0

我使用了以下代码:

--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 服务器仅在该窗口中一直超时,说我的“提交 tran redist1”是阻塞事务,尽管已经完成。我再次运行提交,编辑窗口打开,显示我更改过的数据。

今天早上,我再次打开了编辑窗口,在我运行 FIRST 查询 + 提交之后,表格不知何故又回到了原点。所有后来的查询+提交都丢失了。但是,我在编辑窗口中手动编辑的记录仍然被编辑。

请注意,我每次都使用名称“redist1”,并以适合每个事务的提交或回滚结尾。我的问题是,重用名称是我问题的原因吗?重用名称是否会产生某种类型的冲突?

4

1 回答 1

2

BEGIN TRAN doesn't require any name - the name is optional.

Transactions, however, can be nested and if you did not complete the first one, it will still be in effect even after the others have completed - if you roll it back, they will all roll back.

What probably happened is that you did not commit a transaction, so the following transactions were nested. When the transaction rolled back (possibly due to a timeout), they all rolled back.

于 2013-01-03T15:58:33.447 回答