【问题标题】:Does Begin Tran require a new name each time?Begin Tran 每次都需要一个新名称吗?
【发布时间】:2012-12-18 00:32:20
【问题描述】:

我使用了以下代码:

--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”,以适合每个事务的提交或回滚结尾。我的问题是,重用名称是我问题的原因吗?重用名称会造成某种类型的冲突吗?

【问题讨论】:

    标签: sql-server transactions


    【解决方案1】:

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

    但是,事务可以嵌套,如果您没有完成第一个事务,即使在其他事务完成后它仍然有效 - 如果您回滚,它们都会回滚。

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

    【讨论】:

    • +1,我认为我从未使用过命名事务。我总是在失败时回滚所有内容。
    • 我对提交/回滚非常有条理,所以我确信你描述的意外嵌套没有发生。我在测试后立即提交或回滚,以确保我没有丢失任何东西。每个都说“成功完成”。
    • @Merennulli - 可能。根据您的描述,发生人为错误的可能性更大。
    • 我已经用它做了进一步的测试,虽然最后的额外提交似乎符合嵌套额外事务的想法,但提交语句将是它的结尾,或者“编辑”窗口仍然会遇到锁定。由于它没有遇到锁,并且确实显示了完全修改的数据,因此该更改当时不能绑定在嵌套事务中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多