2012-07-09 108 views
3

大多數頁面我已經讀了「DDL命令在SQL Server中有自動提交」,如果我沒看錯的這一說法只是意味着我們並不需要顯式的commit命令DDL命令。DDL命令是SQL服務器中的AutoCommit,是什麼意思?

那麼爲什麼...

1)改變表EMP添加年齡INT;
UPDATE EMP SET年齡= 20;

失敗,說無效的列名 '年齡'

2)BEGIN TRAN
ALTER TABLE EMP添加年齡INT;
ROLLBACK

可以成功回滾。

也許我錯了自動提交的概念,請用例子來解釋它在那裏actully有特效。

感謝您的任何幫助。

+1

你的第一個例子表明,批次之前將其完全編譯正在執行。它與「自動提交」無關 - 以及你引用哪些資源做出這個聲明? – 2012-07-09 07:36:23

+0

@Damien_The_Unbeliever,k然後我的第一個例子與批次有關,對不起,我把它與AutoCommit聯繫起來。但是你能否讓我理解「DDL命令是AutoCommit」,舉個例子,它實際上意味着什麼? – user369182 2012-07-09 07:42:30

+0

我不知道你從哪裏得到「DDL命令是AutoCommit」的短語 - 它對我來說並沒有什麼意義,因爲Autocommit是一種事務模式(與隱式和顯式事務相比)。 – 2012-07-09 07:45:07

回答

6

Autocommit Transactions

到數據庫引擎實例的連接在自動提交模式,直到BEGIN TRANSACTION語句開始......

所以,你的第二個例子並不適用。進一步下行:

在自動提交模式下,它有時看起來好像數據庫引擎的實例回滾了整個批處理而不是僅僅一條SQL語句。如果遇到的錯誤是編譯錯誤,而不是運行時錯誤,則會發生這種情況。編譯錯誤會阻止數據庫引擎構建執行計劃,因此批處理中不會執行任何操作。

這是你的第一個例子與交易。

所以,沒有一個實際處理自動提交事務。


所以,讓我們像一個語句:

Alter TABLE EMP Add Age INT; 

如果您在自動提交模式打開連接,執行上面的,它完成時沒有錯誤,那麼你會發現,這種連接有沒有打開的事務,並且更改立即可見於任何其他連接。

如果您有隱性事務模式打開連接,執行上面,並且它無錯誤地完成,那麼你會發現,這種連接具有打開的事務。在執行EMP需要模式鎖定的任何操作之前,其他連接將被阻止,直到執行COMMITROLLBACK

如果你有一個開放的連接,你已經執行BEGIN TRANSACTION,執行上面的操作,並且它沒有錯誤地完成 - 那麼你將處於與隱式事務相同的狀態。但是,如果編輯了COMMIT ed或ROLLBACK,則連接將恢復爲自動提交模式或隱式事務模式(在調用BEGIN TRANSACTION之前激活的模式)。

+0

thnx,@Damien_The_Unbeliever這個答案清除了我的很多概念。我認爲「DDL命令是AutoCommit」的概念是在Oracle中,我通過將它與SQL Server混合而感到困惑。現在可以請告訴我,DDL和DML之間有什麼區別,涉及到事務,提交,回滾...... – user369182 2012-07-09 08:08:03

+0

@ user369182 - 沒有想到。 [隱式事務](http://msdn.microsoft.com/zh-cn/library/ms188317(v = sql.105).aspx)上的頁面具有受模式選擇影響的語句的列表。 – 2012-07-09 08:10:44

+0

@Damien_The_Unbeliever,我可以問你是否將你的評論整合到你的答案中?即,「DDL與SQL服務器中的自動提交無關」,這裏的問題是默認情況下oracle中的事務是顯式的,而DDL會自動提交這些顯式事務,所以有人希望看到這是否也是真的在sql server中找到了這個答案,並且乍一看相信它是真的。或者,或者我們將問題修改爲「什麼是sql server中的自動提交」 – 2016-07-20 13:21:20

0

如果你在第二個例子中有一個明確的開始tran,那麼你必須提交它。 (你也可以回滾)

如果你沒有在第一個例子中指定它的顯式,那麼它是自動提交的。

自動提交是SQL Server的默認模式,可如果requried

0

被關閉。如果你在你的代碼添加批次,將工作

Alter TABLE EMP Add Age INT; 
go 
UPDATE EMP SET Age=20;