簡體   English   中英

如果我們不指定事務關鍵字,SQL Server是否會記錄更改?

[英]Will SQL Server record the changes if we don't specify transaction keywords?

如果我們不指定Begin TransCommit Trans等...並且只使用這樣的簡單SQL語句:

delete from myTable where id = 1 

在存儲過程中,

  1. SQL Server會將更改寫入事務日志嗎? 如果是,那么在沒有指定Begin Trans關鍵字時我們如何使用它們(我們不能使用RollBack)。

  2. 當我們編寫存儲過程時,總是使用事務關鍵字是一個好習慣,還是在它們看起來合適時更好(例如當我們需要回滾更改時)?

編輯 :謝謝你們。 但問題的第二部分怎么樣? 如何使用事務日志恢復數據?

默認情況下,SQL Server以auto commit模式運行,這意味着每個語句都自動在其自己的事務中,並自動提交並寫入事務日志(或在發生錯誤時自動回滾)。 提交事務后,無法回滾,您需要從上次備份前滾以糾正任何錯誤(取決於上次備份可用和恢復模型)。

您可以使用set implicit_transactions on更改此行為,之后在發出commit命令之前不會commit任何內容。

關於存儲過程的問題,如果你有多個需要原子處理的語句,你需要顯式的事務控制語句,否則它是可選的。

SQL Server始終只與可用和啟用的事務日志一起工作, by design無法告訴SQL Server不使用它。

這並不排除在某些情況下您有某些命令或選項可以讓您告訴SQL Server最小化日志寫入,例如TRUNCATEDELETE不同,因為數據已被刪除且不會記錄在日志中。 在其他情況下,您可以為某些批量命令指定日志級別以最小化日志記錄。

這樣說,如果您在Management Studio中執行命令或從代碼執行命令並且您沒有指定任何事務(Begin,Commit或rollback),SQL Server會立即提交。

我不是一個SQL人,但我知道AutoCommit的概念也可以更改或設置為與默認值不同的級別。

您上面的刪除將立即應用更改,信息將寫入日志。

通常在存儲過程中,我們不會在存儲過程體本身中注入BEGIN和COMMIT或ROLLBACK,但我們使用來自C#DAL的BeginTrans / Commit或Rollback。

還有其他方法可以做,如果在同一個存儲過程中觸摸多個表,那么在那里有一個本地事務是有意義的,但也可以從代碼中完成它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM