事務是作為單個邏輯工作單元執行的一系列操作。 一個邏輯工作單元必須有四個屬性,稱為原子性、一致性、隔離性和永續性 (ACID) 屬性,只有這樣才能成為一個事務。
一個事務可以包含多個操作。
事務中的所有操作要麼全部成功,要麼全部失敗,沒有第三種狀態。
事務執行前後資料都處於一個最終一致性的狀態;比如庫存扣減前後庫存總量(剩餘庫存+已扣減庫存)總是保持一致。
多事務執行情況下,事務與事務之間相互無感知,相互不影響。
事務一旦提交,其更改對資料庫中的資料是永久性的,即使資料庫發生故障也必須要保證事務正確執行。
通過begin transaction標記事務開始,由commit transaction提交事務,rollback transaction回滾事務。
使用set implicit_transactions on 語句,將隱式事務模式設定為開啟。該模式下不必使用 begin transaction 開啟事務,當一個事務結束後會自動啟用下一個事務,只需使用 commit transaction 提交事務或 Rollback Transaction 回滾事務即可。
SQL Server 的預設模式,它將每條單獨的 T-SQL 語句視為一個事務。如果成功執行,則自動提交。如果錯誤,則自動回滾。相比大家也沒有遇到過update一條記錄多個欄位的時候部分欄位更新成功,部分欄位更新失敗。
多個事務更新同一條資料時導致最後更新完成的事務覆蓋掉了之前事務的更新,這就導致了前面事務的更新丟失。
讀事務讀取到了寫事務還未提交的資料更改,寫事務執行過程中回滾了,導致讀事務前後讀取的資料不一致。
在讀事務範圍內多次執行查詢的結果不一致,因為在讀取事務執行期間有寫事務讀事務讀取的資料進行了修改。
在讀事務範圍內多次執行查詢的結果記錄條數不一致,因為在讀取事務執行期間有寫事務讀事務讀取的資料範圍進行了新增或刪除。
允許事務讀取寫事務未提交的更改(也就是允許髒讀),但不允許更改寫事務正在處理的資料。
不允許其他事務讀取寫事務未提交的更改(不允許髒讀),但允許更改讀事務正在讀取的資料(允許不可重複讀),這也是SQL SERVER預設的事務隔離級別。
不允許其他事務更改讀事務正在讀取的資料(不允許不可重複讀),但是允許新增或刪除(允許幻讀)。
要求事務只能一個一個執行,不能並行,但是效率地下,消耗資料庫效能,一般不使用。
其他隔離級別(拷貝的官方檔案)
當 READ_COMMITTED_SNAPSHOT 資料庫選項設定為 ON 時,已提交讀隔離使用行版本控制提供語句級讀取一致性。 讀取操作只需要 SCH-S 表級別的鎖,不需要頁鎖或行鎖。 也就是說,SQL Server資料庫引擎使用行版本控制來呈現每個語句,其中包含在語句開始時存在的資料的事務一致性快照。 不使用鎖來防止其他事務更新資料。 使用者定義的函數可以返回在包含 UDF 的語句開始後提交的資料。
如果 READ_COMMITTED_SNAPSHOT 資料庫選項設定為 OFF(這是預設設定),當前事務執行讀取操作時,已提交讀隔離使用共用鎖來防止其他事務修改行。 共用鎖還會阻止語句在其他事務完成之前讀取由這些事務修改的行。 兩個實現都滿足已提交讀隔離的 ISO 定義。
快照隔離級別使用行版本控制來提供事務級別的讀取一致性。 讀取操作不獲取頁鎖或行鎖,只獲取 SCH-S 表鎖。 讀取其他事務修改的行時,讀取操作將檢索啟動事務時存在的行的版本。 當 ALLOW_SNAPSHOT_ISOLATION 資料庫選項設定為 ON 時,只能對資料庫使用快照隔離。 預設情況下,使用者資料庫的此選項設定為 OFF。
參考連結:https://www.cnblogs.com/xiongze520/p/14821536.html
https://docs.microsoft.com/zh-cn/sql/relational-databases/sql-server-transaction-locking-and-row-versioning-guide?view=sql-server-ver16