什么是事务、事务的四个特性ACID、不考虑隔离性会导致的三个问题、四种隔离级别
什么是事務、事務的四個特性ACID、不考慮隔離性會導致的三個問題、四種隔離級別
- 1 什么是事務
- 2 事務的四大特性ACID
- 2.1 原子性
- 2.2 一致性
- 2.3 隔離性
- 2.4 持久性
 
- 3 不考慮隔離性會產生的三個問題
- 3.1 臟讀
- 3.2 不可重復讀
- 3.3 幻讀(虛讀)
 
- 4 解決辦法:四種隔離級別
- 4.1 Read Uncommitted(讀取未提交內容)
- 4.2 Read Committed(讀取提交內容)
- 4.3 Repeatable Read(重復讀)
- 4.4 Serializable(可串行化)
 
- 5 注意
- 參考資料
1 什么是事務
事務是應用程序中一系列嚴密的操作,所有操作必須成功完成,否則在每個操作中所做的所有更改都會被撤銷。可以理解為:更新數據庫中各種數據項的程序執行單元。
同一根繩子上的螞蚱,要活一起活,要死一起死。
MySQL事務主要用于處理操作量大,復雜度高的數據。比如說,在人員管理系統中,若刪除一個人員,既要刪除人員的基本資料,也要刪除和該人員相關的信息,如信箱和文章等等,這些數據庫操作語句構成一個事務。
- 在MySQL中,只有使用了Innodb數據庫引擎的數據庫或表才支持事務。
- 事務處理可以用來維護數據庫的完整性,保證成批的SQL語句要么全部執行,要么全部不執行
- 事務用來管理insert,update,delete語句
在MySQL命令行的默認設置下,事務都是自動提交的,即執行SQL語句后就會馬上執行COMMIT操作。因此要顯式地開啟一個事務,必須使用命令BEGIN或者START TRANSACTION,或者執行命令SET AUTOCOMMIT=0,用來禁止使用當前會話的自動提交。
2 事務的四大特性ACID
一般來說,事務必須滿足四個條件(ACID):原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、持久性(Durability)。
2.1 原子性
一個事務(transaction)中的所有操作,要么全部完成,要么全部不完成,不會結束在中間某個環節,事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有被執行過一樣。
一組操作要么都發生,要么都不發生。
2.2 一致性
在事務開始之前和事務結束之后,數據庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及后續數據庫可以自發性地完成預定地工作。
事務的執行結果必須是使數據庫從一個一致性狀態變到另一個一致性狀態。因此當數據庫只包含成功事務提交的結果時,就說數據庫處于一致性狀態。如果數據庫系統運行中發生故障,有些事務尚未完成就被中斷,這些未完成的事務對數據庫所做的修改有一部分已經寫入物理數據庫,這時數據庫就處于一種不正確的狀態,或者說不一致的狀態。
2.3 隔離性
數據庫允許多個并發事務,同時對數據進行讀寫和修改的能力,隔離性可以防止多個事務并發執行時,由于交叉執行而導致數據的不一致。事務隔離分為不同的級別,包括讀未提交(Read uncommitted)、讀提交(Read committed)、可重復讀(repeatable read)和串行化(Serializable)。
一個事務的執行不能受其他事務的干擾。即一個事務內部的操作及使用的數據,對其他并發事務是隔離的,并發的各個事務之間不能互相干擾。
2.4 持久性
事務處理結束后,對數據的修改就是永久的,即便系統故障也不會丟失。
一個事務一旦提交,對數據庫中的數據的改變就應該是永久性的,接下來的其他操作或故障不應該對其執行結果有任何影響。
3 不考慮隔離性會產生的三個問題
3.1 臟讀
臟讀是指在一個事務處理過程中,讀取了另一個未提交的事務中的數據。
3.2 不可重復讀
一個事務兩次讀取同一行的數據,結果得到不同狀態的結果,中間正好另一個事務更新了該數據,兩次結果相異,不可被信任。通俗的講就是:事務T1在讀取某一個數據,而事務T2立馬修改了這個數據,并且提交事務給數據庫,事務T1再次讀取該數據就得到了不同的結果,發生了不可重復讀。
3.3 幻讀(虛讀)
一個事務執行兩次查詢,第二次結果集包含了第一次中沒有或某些行已經被刪除的數據,造成兩次結果不一致,只是另一個事務在這兩次查詢中間插入或刪除了數據造成的。
通俗來講就是:例如,事務T1對一個表中所有的行的某個數據項做了從“1”修改為“2”的操作,這時事務T2又對這個表中插入了一行數據項,而這個數據項的數值還是為“1”,并且提交給數據庫,而操作事務T1的用戶,如果再查看剛剛修改的數據,會發現還有一行沒有修改,其實這行是從事務T2中添加的,就好像產生幻覺一樣,這就發生了幻讀。
4 解決辦法:四種隔離級別
4.1 Read Uncommitted(讀取未提交內容)
讀未提交,顧名思義,就是一個事務可以讀取另一個未提交事務的數據。但是,讀未提交產生了臟讀,采用讀提交可以解決臟讀問題
4.2 Read Committed(讀取提交內容)
讀提交,顧名思義,就是一個事務要等另一個事務提交后才能讀取數據。讀提交,若有事務對數據進行更新(UPDATE)操作時,讀操作事務要等待這個更新操作事務提交后才能讀取數據,可以解決臟讀問題。但在這個事例中,出現了一個事務范圍內兩個相同的查詢卻返回了不同數據,這就是不可重復讀。但是,讀提交兩次查詢會產生不同的查詢結果,就會造成不可重復讀問題,采用重復讀可以解決此問題。
4.3 Repeatable Read(重復讀)
重復讀,就是在開始讀取數據(事務開啟)時,不再允許修改操作。重復讀可以解決不可重復讀問題。應該明白的一點就是,不可重復讀對應的是修改,即UPDATE操作。但是可能還會有幻讀問題。因為幻讀問題對應的是插入INSERT操作,而不是UPDATE操作。采用Serializable可以解決幻讀問題
4.4 Serializable(可串行化)
Serializable 是最高的事務隔離級別,在該級別下,事務串行化順序執行,可以避免臟讀、不可重復讀與幻讀。但是這種事務隔離級別效率低下,比較耗數據庫性能,一般不使用。
5 注意
1、大多數數據庫默認的事務隔離級別是Read committed,比如Sql Server , Oracle。Mysql的默認隔離級別是Repeatable read。
2、隔離級別的設置只對當前鏈接有效。對于使用MySQL命令窗口而言,一個窗口就相當于一個鏈接,當前窗口設置的隔離級別只對當前窗口中的事務有效;對于JDBC操作數據庫來說,一個Connection對象相當于一個鏈接,而對于Connection對象設置的隔離級別只對該Connection對象有效,與其他鏈接Connection對象無關。
3、設置數據庫的隔離級別一定要是在開啟事務之前。
參考資料
總結
以上是生活随笔為你收集整理的什么是事务、事务的四个特性ACID、不考虑隔离性会导致的三个问题、四种隔离级别的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Java软件开发:自定义MyBatis持
- 下一篇: getitem
