2013-01-03 45 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

相關問題