SQL Server事務(wù)隔離級別
發(fā)布日期:2022/9/7 21:49:13 瀏覽量:
事務(wù)
定義
事務(wù)是作為單個邏輯工作單元執(zhí)行的一系列操作。 一個邏輯工作單元必須有四個屬性,稱為原子性、一致性、隔離性和持久性 (ACID) 屬性,只有這樣才能成為一個事務(wù)。
一個事務(wù)可以包含多個操作。
事務(wù)特性
- 原子性(atomicity)
事務(wù)中的所有操作要么全部成功,要么全部失敗,沒有第三種狀態(tài)。
- 一致性(consistency)
事務(wù)執(zhí)行前后數(shù)據(jù)都處于一個最終一致性的狀態(tài);比如庫存扣減前后庫存總量(剩余庫存+已扣減庫存)總是保持一致。
- 隔離性(isolation)
多事務(wù)執(zhí)行情況下,事務(wù)與事務(wù)之間相互無感知,相互不影響。
- 持久性(durability)
事務(wù)一旦提交,其更改對數(shù)據(jù)庫中的數(shù)據(jù)是永久性的,即使數(shù)據(jù)庫發(fā)生故障也必須要保證事務(wù)正確執(zhí)行。
事務(wù)分類
- 顯式事務(wù)
通過begin transaction標記事務(wù)開始,由commit transaction提交事務(wù),rollback transaction回滾事務(wù)。
- 隱式事務(wù)
使用set implicit_transactions on 語句,將隱式事務(wù)模式設(shè)置為打開。該模式下不必使用 begin transaction 開啟事務(wù),當一個事務(wù)結(jié)束后會自動啟用下一個事務(wù),只需使用 commit transaction 提交事務(wù)或 Rollback Transaction 回滾事務(wù)即可。
- 自動提交事務(wù)
SQL Server 的默認模式,它將每條單獨的 T-SQL 語句視為一個事務(wù)。如果成功執(zhí)行,則自動提交。如果錯誤,則自動回滾。相比大家也沒有遇到過update一條記錄多個字段的時候部分字段更新成功,部分字段更新失敗。
事務(wù)不隔離產(chǎn)生的問題
- 更新丟失
多個事務(wù)更新同一條數(shù)據(jù)時導(dǎo)致最后更新完成的事務(wù)覆蓋掉了之前事務(wù)的更新,這就導(dǎo)致了前面事務(wù)的更新丟失。
- 臟讀
讀事務(wù)讀取到了寫事務(wù)還未提交的數(shù)據(jù)更改,寫事務(wù)執(zhí)行過程中回滾了,導(dǎo)致讀事務(wù)前后讀取的數(shù)據(jù)不一致。
- 不可重復(fù)讀
在讀事務(wù)范圍內(nèi)多次執(zhí)行查詢的結(jié)果不一致,因為在讀取事務(wù)執(zhí)行期間有寫事務(wù)讀事務(wù)讀取的數(shù)據(jù)進行了修改。
- 幻讀
在讀事務(wù)范圍內(nèi)多次執(zhí)行查詢的結(jié)果記錄條數(shù)不一致,因為在讀取事務(wù)執(zhí)行期間有寫事務(wù)讀事務(wù)讀取的數(shù)據(jù)范圍進行了添加或刪除。
事務(wù)隔離級別
Read Uncommitted(可讀未提交)
允許事務(wù)讀取寫事務(wù)未提交的更改(也就是允許臟讀),但不允許更改寫事務(wù)正在處理的數(shù)據(jù)(不允許更新丟失)。
Read Committed(可讀已提交)
不允許其他事務(wù)讀取寫事務(wù)未提交的更改(不允許臟讀),但允許更改讀事務(wù)正在讀取的數(shù)據(jù)(允許不可重復(fù)讀),這也是SQL SERVER默認的事務(wù)隔離級別。
Repeatable Read(可重復(fù)讀)
不允許其他事務(wù)更改讀事務(wù)正在讀取的數(shù)據(jù)(不允許不可重復(fù)讀),但是允許新增或刪除(允許幻讀)。
Serializable(序列化)
要求事務(wù)只能一個一個執(zhí)行,不能并發(fā),但是效率地下,消耗數(shù)據(jù)庫性能,一般不使用。
其他隔離級別(拷貝的官方文檔)
讀取已提交的快照(READ_COMMITTED_SNAPSHOT)
當 READ_COMMITTED_SNAPSHOT 數(shù)據(jù)庫選項設(shè)置為 ON 時,已提交讀隔離使用行版本控制提供語句級讀取一致性。 讀取操作只需要 SCH-S 表級別的鎖,不需要頁鎖或行鎖。 也就是說,SQL Server數(shù)據(jù)庫引擎使用行版本控制來呈現(xiàn)每個語句,其中包含在語句開始時存在的數(shù)據(jù)的事務(wù)一致性快照。 不使用鎖來防止其他事務(wù)更新數(shù)據(jù)。 用戶定義的函數(shù)可以返回在包含 UDF 的語句開始后提交的數(shù)據(jù)。
如果 READ_COMMITTED_SNAPSHOT 數(shù)據(jù)庫選項設(shè)置為 OFF(這是默認設(shè)置),當前事務(wù)運行讀取操作時,已提交讀隔離使用共享鎖來防止其他事務(wù)修改行。 共享鎖還會阻止語句在其他事務(wù)完成之前讀取由這些事務(wù)修改的行。 兩個實現(xiàn)都滿足已提交讀隔離的 ISO 定義。
快照
快照隔離級別使用行版本控制來提供事務(wù)級別的讀取一致性。 讀取操作不獲取頁鎖或行鎖,只獲取 SCH-S 表鎖。 讀取其他事務(wù)修改的行時,讀取操作將檢索啟動事務(wù)時存在的行的版本。 當 ALLOW_SNAPSHOT_ISOLATION 數(shù)據(jù)庫選項設(shè)置為 ON 時,只能對數(shù)據(jù)庫使用快照隔離。 默認情況下,用戶數(shù)據(jù)庫的此選項設(shè)置為 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
馬上咨詢: 如果您有業(yè)務(wù)方面的問題或者需求,歡迎您咨詢!我們帶來的不僅僅是技術(shù),還有行業(yè)經(jīng)驗積累。
QQ: 39764417/308460098 Phone: 13 9800 1 9844 / 135 6887 9550 聯(lián)系人:石先生/雷先生