事務回顧之事務特性_併發問題_隔離級別_傳播行為

ruoshui__999發表於2020-12-28

事務回顧之事務特性_併發問題_隔離級別_傳播行為

程式設計式事務:在業務程式碼中新增事務控制程式碼(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的⻆度來觀察來定義事務的傳播⾏為
在這裡插入圖片描述

相關文章