springboot數據源自動裝配以及事務管理


1.springboot項目中只是在yml文件中添加數據源的屬性,並沒有顯示的配置當成組件注入到spring中,但是spring依舊能使用這個數據源,原因是boot對於數據源的自動裝配,原理參考下面大神鏈接。

https://blog.csdn.net/qq_28410283/article/details/86700635

2.公司的老項目在mybatis調用存儲過程的時候報只讀錯誤 read-only:這是由於事物的傳播特性中沒有配置call屬性,配上call屬性並把只讀設為false就可以了,注:我的存儲過程涉及到了數據庫的修改,所以不用函數,因為函數的調用是用select調用的,而一般的select只是查詢作用不允許數據修改,所以不要把select 的只讀屬性改成false。

 

 3.在上述的事務配置中還有一個屬性就是propagation,參考下邊博文,這里用的是required,意思是如果沒有事務就創建一個,有的話就用前邊的,這樣的話,如果是一個添加一個刪除兩條命令放在一起的話,因為我們配置的事務都是required所以兩條命令就可以保證事務性,當拋出lang的異常時,就會回滾,這個屬性也是默認的屬性,xml文件配置和注解配置都是進行事務管理的辦法。

https://blog.csdn.net/weixin_39723544/article/details/91877478

5.那spring怎么進行控制事務的呢?

基於注解的話就不用說了,基於xml的事務控制其實也是運用了AOP,具體看一下配置:配置上明確說了,事務是控制在service層中的,所以,如果一個接口中有多個數據庫操作的話,把他們都寫在service層中,這樣就可以實現事務管理了。

6.在mysql中事務之間是怎樣工作的呢?參考下邊博文,因為事務之間具有隔離性,所謂的事務就是一個線程,在多線程中怎么保證數據安全呢?加鎖,數據庫也會對數據進行加鎖,當一個事務修改數據時(假設這個事務有兩條修改語句,加鎖的時間是在第一條修改語句執行之后,然后這條數據被加了鎖,這個事務不結束的話,另一個事務的修改語句就不能對這條記錄進行操作)另一個事務就不能對數據進行修改,類似於cpu對線程的上下文切換。

https://blog.csdn.net/weixin_39723544/article/details/98200870?depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1&utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1

7.事務的隔離級別的理解:基於mysql不自動提交的情況(一般默認自動提交)

我對事務的理解:一個事務就像回家的過程:開門-進門-關門  對應事務的開始-操作-提交/回滾 這樣才是一個完整的事務。

4個隔離級別:

讀未提交:修改一條數據后,這個事務還沒有提交,但是可以被讀到:也就是一個文件還沒有蓋章,沒有蓋章就是不確定,有兩種選擇:蓋上章生效或者撕掉文件無效,但是這時候有的員工看到了,以為這個是老板的文件那肯定有效啊,但是文件的有效無效是不確定的,這個過程就是讀未提交。

讀已提交:假如有一個事務正在執行兩次查詢操作,一條查詢完后另一個事務要修改(update,不是insert)這條數據,查詢的時候沒加鎖啊,所以改就改了,改了之后再查詢這個數據的話發現兩條一樣的sql查詢出來的東西不一樣,這就是讀已提交,但是不可重復讀。

可重復讀:可重復讀就是查詢的事務(兩條查詢的sql語句)開啟時,另一個修改的事務不能介入了(解決了update問題,但是帶來了insert幻讀的問題,也就是查詢的事務之間insert是可以介入的),相當於加鎖操作(加鎖其實不太准確,因為只是確保一個事務兩條查詢的結果相同,但是對另一個事務的修改操作而言,它是已經修改成功數據的),帶來的問題是幻讀,但是mysql采用mvcc解決了幻讀問題,幻讀和不可重復讀的區別是:幻讀是插入數據的時候出現的,不可重復讀是更新的時候出現的,所以一般來說就用這個隔離級別。

串行:絕對的數據安全,讀寫操作都會鎖住整張表,帶來大量的鎖競爭,消耗資源,不用這個。

下圖很好的解釋了可重復讀在mvcc下的概念我認為很重要的一個概念:不可見不等於不存在

 

 8.既然mvcc解決了問題,那為什么還有串行化這個 概念?

因為有一種特殊情況:先查再改。因為查詢不加鎖(或者共享鎖)因此事務A和B在查詢的時候數據互通,但是接着事務B修改了一條數據,這時候對於這條數據進行加鎖,事務A不能修改,只能等到事務B結束,然后事務A在修改,事務A修改是修改的什么呢?因為他之前執行了一次查詢操作,又因為隔離級別是RR級別,所以數據更新就發生錯誤了,避免這種情況的方法就是直接修改最新的數據,去掉查詢,這樣在update的時候已經加鎖,保證數據的安全。

 

 

 

關於隔離級別的博文:

https://blog.csdn.net/weixin_39723544/article/details/91653513

關於mvcc參考下邊博文:

https://blog.csdn.net/weixin_39723544/article/details/98200870?depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1&utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM