事務回顧之事務特性_併發問題_隔離級別_傳播行為
事務回顧之事務特性_併發問題_隔離級別_傳播行為
程式設計式事務:在業務程式碼中新增事務控制程式碼(try catch對事物的提交回滾),這樣的事務控制機制就叫做程式設計式事務
宣告式事務:事務控制程式碼和業務程式碼分離,通過xml或者註解配置的⽅式達到事務控制的⽬的,叫做宣告式事務
-
事物的概念
事務指邏輯上的⼀組操作,組成這組操作的各個單元,要麼全部成功,要麼全部不成功。從⽽確保了資料的準確與安全。 例如:A——B轉帳,對應於如下兩條sql語句: /*轉出賬戶減錢*/ update account setmoney=money-100 where name=‘a’; /**轉⼊賬戶加錢*/ update account set money=money+100 where name=‘b’; 這兩條語句的執⾏,要麼全部成功,要麼全部不成功。
-
事務的四⼤特性
原⼦性(Atomicity)
原⼦性是指事務是⼀個不可分割的⼯作單位,事務中的操作要麼都發⽣,要麼都不發⽣。從操作的⻆度來描述,事務中的各個操作要麼都成功要麼都失敗
⼀致性(Consistency)
事務必須使資料庫從⼀個⼀致性狀態變換到另外⼀個⼀致性狀態。
例如轉賬前A有1000,B有1000。轉賬後A+B也得是2000。
⼀致性是從資料的⻆度來說的,(1000,1000) (900,1100),不應該出現(900,1000)
隔離性(Isolation)
事務的隔離性是多個⽤戶併發訪問資料庫時,資料庫為每⼀個⽤戶開啟的事務,
每個事務不能被其他事務的運算元據所⼲擾,多個併發事務之間要相互隔離。
⽐如:事務1給員⼯漲⼯資2000,但是事務1尚未被提交,員⼯發起事務2查詢⼯資,發現⼯資漲了2000塊錢,讀到了事務1尚未提交的資料(髒讀)
永續性(Durability)
永續性是指⼀個事務⼀旦被提交,它對資料庫中資料的改變就是永久性的,接下來即使資料庫發⽣故障也不應該對其有任何影響。
- 事務的隔離級別
不考慮隔離級別,會出現以下情況:(以下情況全是錯誤的),也即為隔離級別在解決事務併發問題
髒讀:⼀個執行緒中的事務讀到了另外⼀個執行緒中未提交的資料。
不可重複讀:⼀個執行緒中的事務讀到了另外⼀個執行緒中已經提交的update的資料(前後內容不⼀樣)
場景:
員⼯A發起事務1,查詢⼯資,⼯資為1w,此時事務1尚未關閉
財務⼈員發起了事務2,給員⼯A張了2000塊錢,並且提交了事務
員⼯A通過事務1再次發起查詢請求,發現⼯資為1.2w,原來讀出來1w讀不到了,叫做不可重複讀
虛讀(幻讀):⼀個執行緒中的事務讀到了另外⼀個執行緒中已經提交的insert或者delete的資料(前後條
數不⼀樣)
場景:
事務1查詢所有⼯資為1w的員⼯的總數,查詢出來了10個⼈,此時事務尚未關閉
事務2財務⼈員發起,新來員⼯,⼯資1w,向表中插⼊了2條資料,並且提交了事務
事務1再次查詢⼯資為1w的員⼯個數,發現有12個⼈,⻅了⻤了
資料庫共定義了四種隔離級別:
Serializable(串⾏化):可避免髒讀、不可重複讀、虛讀情況的發⽣。(串⾏化) 最⾼
Repeatable read(可重複讀):可避免髒讀、不可重複讀情況的發⽣。(幻讀有可能發⽣) 第⼆
該機制下會對要update的⾏進⾏加鎖
Read committed(讀已提交):可避免髒讀情況發⽣。不可重複讀和幻讀⼀定會發⽣。 第三
Read uncommitted(讀未提交):最低階別,以上情況均⽆法保證。(讀未提交) 最低
注意:級別依次升⾼,效率依次降低
MySQL的預設隔離級別是:REPEATABLE READ
查詢當前使⽤的隔離級別: select @@tx_isolation;
設定MySQL事務的隔離級別: set session transaction isolation level xxx; (設定的是當前
mysql連線會話的,並不是永久改變的)
- 事務的傳播⾏為
事務往往在service層進⾏控制,如果出現service層⽅法A調⽤了另外⼀個service層⽅法B,A和B⽅法本
身都已經被新增了事務控制,那麼A調⽤B的時候,就需要進⾏事務的⼀些協商,這就叫做事務的傳播⾏ 為。
A調⽤B,我們站在B的⻆度來觀察來定義事務的傳播⾏為
相關文章
- 什麼是事務、事務特性、事務隔離級別、spring事務傳播特性?Spring
- 資料庫之事務、隔離級別和併發問題資料庫
- MySQL事務的隔離級別與併發問題MySql
- 事務、特性、隔離級別
- Mariadb之事務隔離級別
- 事務ACID特性與隔離級別
- 資料庫事務併發產生的問題以及事務的隔離級別資料庫
- 事務基礎特性及隔離級別
- MySQL之事務隔離級別和MVCCMySqlMVC
- Spring的事務管理(一) Spring事務管理的實現,事務的屬性(隔離級別,傳播行為,只讀)Spring
- MySQL事務隔離級別MySql
- MySQL 事務隔離級別MySql
- [Mysql]事務/隔離級別MySql
- PostgreSQL事務隔離級別SQL
- 事務的四大特性,以及隔離級別
- MySQL事務的隔離級別MySql
- 事務四種隔離級別
- 理解MySQL事務隔離級別MySql
- MySQL的事務隔離級別MySql
- MySQL 事務的四大特性以及隔離級別MySql
- 事務的隔離級別與所帶來的問題
- SqlServer事務詳解(事務隔離性和隔離級別詳解)SQLServer
- 資料庫事務的四大特性以及事務的隔離級別資料庫
- 論 MySQL 之事務隔離級別 | 資料庫篇MySql資料庫
- 資料庫事務併發問題----各種事務隔離下的情況資料庫
- MySQL事務隔離級別和MVCCMySqlMVC
- 事務的四種隔離級別
- 理解mysql的事務隔離級別MySql
- 事務系統的隔離級別
- 啥是 MySQL 事務隔離級別?MySql
- mysql如何修改事務隔離級別MySql
- 事務的隔離級別與MVCCMVC
- mysql事務隔離級別和鎖MySql
- Mysql鎖與事務隔離級別MySql
- Mysql 四種事務隔離級別MySql
- 資料庫事務 ACID屬性、資料庫併發問題和四種隔離級別資料庫
- 資料庫事務與事務的隔離級別資料庫
- 資料庫事務的隔離級別及四大特性資料庫