什麼是事務
簡單的說, 事務: 就是將一堆的sql語句的執行, 繫結在一起, 要麼全部執行成功, 要麼全部執行失敗!!
以轉賬為例: 現有a, b兩個賬戶, 金額都是1000元, 現在a要轉賬給b 100元:
update acc set money=money-100 where name=』a』;
update acc set money=money+100 where name=』b』;
如果a賬戶減去100元執行成功了, 但是b加上100元(因為一些裝置故障導致)失敗了, 此時a+b的總金額比轉賬之前少了100??
事實上, 這種事情在現實生活中是不會出現的.
因為, 轉賬操作中的所有sql語句是在乙個事務中的, 要麼全部執行成功, 要麼全部執行失敗, 如果b加上100執行失敗了, a減去100必然也會失敗!!
2 .事務的四大特性
1.原子性: 事務中的所有操作都是不可再分割的原子單位, 要麼全成功, 要麼全失敗!!
2.一致性: 事務前後的業務資料總和是保持一致的, 比如轉賬之前, a和b的賬號金額之和是2000元, 無論a給b轉賬多少錢, 無論成功與否, 轉賬之後的a和b的賬號金額之和也必然是2000元
3.隔離性: 兩個事務的操作是完全隔離的, 乙個事務不能檢視到另外乙個事務正在執行的狀態, 比如a轉賬給b賬號, a剛減去100元, 此時會不會被另外乙個事務檢視到這個狀態??? 答案是不會的, 另外乙個事務, 要麼檢視轉賬操作進行之前的狀態, 要麼檢視到轉賬操作結束之後的狀態, 不可能看到中間的狀態, 因為事務之間是隔離開來的!!
4.永續性: 只有在事務提交成功後, 事務中對資料的修改才會真正的儲存到資料庫中, 否則就是撤銷之前的操作.
3.mysql中的事務
在預設情況下,mysql每執行一條sql語句,都是乙個單獨的事務。如果需要在乙個事務中包含多條sql語句,那麼需要開啟事務和結束事務。
開啟事務:start transaction;
結束事務:commit(提交事務)或rollback(回滾事務)。
在執行sql語句之前,先執行strat transaction,這就開啟了乙個事務(事務的起點),然後可以去執行多條sql語句,最後要結束事務,commit表示提交,即事務中的多條sql語句所做出的影響會持久化到資料庫中。或者rollback,表示回滾,即回滾到事務的起點,之前做的所有操作都被撤消了!
4.事務併發讀問題
多個事務對相同的資料同時進行操作,這叫做事務併發。
在事務併發時,如果沒有採取必要的隔離措施,可能會導致各種併發問題,破壞資料的完整性等。這些問題中,其中有三類是讀問題,分別是:髒讀、不可重複讀、幻讀。
(1)髒讀(dirty read):讀到另乙個事務的未提交更新資料,即讀取到了髒資料;
例如:a給b轉賬100元但未提交事務,在b查詢後,a做了回滾操作,那麼b查詢到了a未提交的資料,就稱之為髒讀。
事務1:
a-100 900
b+100 1100
沒有提交事務(資料並沒有真正的儲存到資料庫)
回滾事務2:
b 1100
(2)不可重複讀(unrepeatable read):對同一記錄的兩次讀取不一致,因為另一事務對該記錄做了修改(是針對修改操作)
例如:在事務1中,前後兩次查詢a賬戶的金額,在兩次查詢之間,另一事物2對a賬戶的金額做了修改,此種情況可能會導致事務1中,前後兩次查詢的結果不一致。這就是不可重複讀.
事務1:
查詢1: a 1000
查詢2: a 900
事務2:
修改: a 900
提交了事務
(3)幻讀(虛讀)(phantom read):對同一張表的兩次查詢不一致,因為另一事務插入了一條記錄(是針對插入或刪除操作);
事務1:
select * from acc where id=3;
插入: 插入失敗了…
事務2:
insert into acc value(3, 『c』, 1000);
注意:mysql預設的是不允許出現髒讀和不可重複讀,所以在下面演示之前需要設定mysql允許出現髒讀、不可重複讀等。
set tx_isolation=『read-uncommitted』;
5事務隔離級別
事務隔離級別分四個等級,在相同資料環境下,對資料執行相同的操作,設定不同的隔離級別,可能導致不同的結果。不同事務隔離級別能夠解決的資料併發問題的能力也是不同的。
set tx_isolation=『read-uncommitted』;
1、read uncommitted(讀未提交資料)
安全級別最低, 可能出現任何事務併發問題(比如髒讀、不可以重複讀、幻讀等)
效能最好(不使用!!)
2、read committed(讀已提交資料)(oracle預設)
防止髒讀,沒有處理不可重複讀,也沒有處理幻讀;
效能比repeatable read好
3、repeatable read(可重複讀)(mysql預設)
防止髒讀和不可重複讀,不能處理幻讀問題;
效能比serializable好
4、serializable(序列化)
不會出現任何併發問題,因為它是對同一資料的訪問是序列的,非併發訪問的;
效能最差;
mysql的預設隔離級別為repeatable read,即可以防止髒讀和不可重複讀
事務四大特性
1 原子性 將事務中所做的操作 成乙個原子單元,即對於事務所進行的資料修改等操作,要麼全部執行,要麼全部不執行。2 一致性 事務執行的結果必須是使資料庫從乙個一致性狀態變到另乙個一致性狀態。事務在完成時,必須使所有的資料都保持一致狀態,而且在相關資料中,所有規則都必須應用於事務的修改,以保持所有資料...
事務四大特性
資料庫事務有四大特性,分別是 原子性 一致性 隔離性和永續性。原子性 atomicity 事務是資料庫的邏輯工作單位,它對資料庫的修改要麼全部執行,要麼全部不執行。一致性 consistemcy 事務前後,資料庫的狀態都滿足所有的完整性約束。隔離性 isolation 併發執行的事務是隔離的,乙個不...
事務四大特性
事務四大特性 acid 1 原子性 atomicity 化學中的原子指不可再分的基本微粒,資料庫中原子性強調事務是乙個不可分割的整體,事務開始後所有操作要麼全部成功,要麼全部失敗,不可能停滯在中間某個環節。如果事務執行過程 錯就會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣不會對資料庫有任何影...