這段時間趁著工作不忙,一起來回顧一下Mybatis+mysql的一些底層東西
?
一、mysql
?1:mysql鎖有哪些?---》共享鎖(讀鎖)和排他鎖(寫鎖)
? ?1):共享鎖(通過 lock in share model實現)
? ? ? 共享鎖又叫讀鎖,也就是執行一條查詢sql語句的時候實現的,一旦共享鎖,此時查詢的數據被鎖定,不能被其他事務進行寫操作
? ?2):排它鎖(寫鎖)
? ? ? ? ?個人對排它鎖定義:排它鎖就是對數據鎖定,很大程度上講數據不能被其他事務修改(個人理解,僅關參考)
? ? ? ? ?正解:排它鎖又分為表級鎖和行級鎖,下面詳細講解這兩個鎖的作用:
? ? ?2.1)表級鎖:一旦事務使用的是表級鎖,那么整個表的數據不能被讀取以及修改,一般是不會這么操作。
? ? ?2.2)行級鎖:行級鎖的作用就是事務開啟,鎖定當前讀取的行數據不能被修改或者通過版本號控制修改成功或失?。▊€人總結,僅供參考)
? ? ? ? ?正解:行級鎖又分為樂觀鎖,悲觀鎖,下面詳細講解:
? ? ?2.2.1)悲觀鎖(通過for update 實現):悲觀鎖的含義就是事務開啟使用悲觀鎖,此時讀取的行數據,不能被修改
? ? ? ? ? ? ? ? 示范sql:select * from user where id=1 for update;
?
? ? ?2.2.2)樂觀鎖:樂觀鎖的話是允許其他事務讀取或者修改,但是修改成功與否通過版本號 version 來控制
? ??
二:事務的隔離性和隔離級別---相信大家都知道的,但是因為需要講解其他內容,必須引入這該死的簡單東西
? 隔離特性:
? ? 原子性? -? -? 要么全部失敗,要么全部成功
? ? 一致性? -? -? 一般用在轉賬,A賬戶扣1000,轉到B賬戶,B賬戶增加1000
? ?隔離性? ?-? -? 一個事物正在處理的數據,其他事務不能看見
? ?持久性? ?-? -? 數據一旦保存到數據庫,那么數據永久保存
?隔離級別:
? ? 1-讀未提交
? ? ? ? ?比如兩個事物A、B。事物A在讀取的數據,正好是事物B正在修改但是未commit事物的用戶的名字 張三-->李四,然后此時事物B出現程序錯誤,但是A讀取的是李四來操作數據,這就是幻讀(后面講解MVCC+間隙鎖來解決幻讀)
?
? ? 2-讀已提交
? ? ? ??比如兩個事物A、B。事物A在第一次讀取在讀取用戶表id=1的數據是張三,正好此時事物B正在修改并且提交了事物(commit)commit事物的用戶的名字 張三-->李四,某些情況下事物A再查詢一遍是否是張三,但是事物B已經修改并且提交,此時事物A讀取到的是李四,這就是兩次讀取的結果不一致
?
? ? 3-可重復復讀
? ? ? ? mysql的默認隔離級別,每次讀取的結果都一樣,但是會產生幻讀(MVCC+間隙鎖解決)
? ? 4-串行?
? ? ? ?該種隔離級別一般不會使用,因為會給每一行數據都會加鎖,導致大量的超時鎖和鎖鎖競爭問題
?
三:ACID如何保證?
? ?A:原子性 ——數據庫有undo log日志。記錄需要回滾的日志信息。事務回滾時撤銷已經成功執行的sql
? C:一致性——使用代碼保證(一般都是用try cay語句的咯,并且方法上加上@Transtal(level=Excetion.class))
? ?I :隔離性 —— MVCC(詳細講解MVCC傳送們)
? D:持久性 —— 內存+redo log日志。sql執行的時候,commit事務后,會通過redo log刷盤,宕機的時候,可以通過redo log恢復。
?
四:MVCC是什么?如何解決幻讀
?
?
九:mybatis 的編譯原理以及執行原理
? ? ?1、編譯原理:看下圖,整體流程就不用文字描述,相信大伙能看懂!
? ? ? ??
? 2:執行原理--照樣看圖比較直觀(大致流程大伙應該能看得懂,要是還看不懂,那就gg了)
?
?
?
十、mybatis的組成結構圖
?
十一、?mybatis的exectory執行器有哪些,有哪些區別?
? 我們能看到第十點的mybatis總結架構圖,第二組成部分的 SQL執行,里面包含3種執行器:下面詳細說:
?SimpleExectory執行器:執行select和update的sql語句,每次執行sql,都會創建Statement對象,用完就關閉
?
?RuseExectory執行器:執行select和update的sql語句,它的區別在于使用執行的sql作為key,在Map<String,Statement>做緩存,如果沒有,則創建Statement對象,并且緩存到Map<String,Statement>里面,用完不關閉Statement對象
?
?BatchExectory執行器:只執行update語句(JDBC不支持批量查詢),將sql添加到 addBatch()中,等待統一執行 exectoryBatch()。它緩存了多個Statement對象
?
十二、mybatis為啥要預編譯處理?
我們首先了解預編譯處理的好處:JDBC使用PrestateStatement 來抽象預編譯sql語句,預編譯后可以優化sql語句,并且一般都能夠直接執行,所以DBMS(mysql、SQL或其他數據庫不需要再進行預編譯處理),并且預編譯的語句對象可重復利用,即 PrepareStatement 對象緩存下載
?
?
?
?
?
本文摘自 :https://blog.51cto.com/u