阿里的一個面試題:怎麼保證spring事務內的鏈接惟一性

阿里二面的時候被問到的一個問題:面試

在spring的同一個事務內的多個方法,是怎麼保證使用的是同一個數據庫鏈接?原理是什麼?涉及框架中的哪些類,具體做用是什麼?舉出幾個例子。spring

阿里的一個面試題:怎麼保證spring事務內的鏈接惟一性

 

最佳答案以下:數據庫

事務,是描述一組操做的抽象,好比對數據庫的一組操做,要麼所有成功,要麼所有失敗。編程

事務具備4個特性:安全

§ Atomicity(原子性)多線程

§ Consistency(一致性)架構

§ Isolation(隔離性)框架

§ Durability(持久性)線程

事務是否生效取決數據庫底層是否支持(好比MySQL的MyISAM引擎就不支持事務,Spring能奈何!),同時一個事務的多個操做須要在同一個Connection上。視頻

事務也每每是在業務邏輯層來控制。

寫一個獲得數據庫鏈接的管理類ConnectionManager

阿里的一個面試題:怎麼保證spring事務內的鏈接惟一性

 

在Spring中,有時候咱們是否是要配置多個數據源DataSource?

很顯然,Spring須要經過DataSource來獲得操做數據庫的管道Connection。

這裏經過ConnectionManager類來完成這個過程,須要思考的是在多線程下,這顯然是存在問題的。

爲避免多線程問題,難道咱們採用線程安全的Map,好比ConcurrentHashMap,其實咱們真正的目的是什麼?

是保證一個線程下,一個事務的多個操做拿到的是一個Connection,顯然使用ConcurrentHashMap根本沒法保證!

Spring很聰明,她提供了一種思路,來解決,看下面的代碼!

阿里的一個面試題:怎麼保證spring事務內的鏈接惟一性

原本線程不安全的,經過ThreadLocal這麼封裝一下,馬上就變成了線程的局部變量,不單單安全了。

還保證了一個線程下面的操做拿到的Connection是同一個對象!

這種思想,確實很是巧妙,這也是無鎖編程思想的一種方式!

最後寫一個TransactionManager,這樣咱們就能夠管理事務了。

阿里的一個面試題:怎麼保證spring事務內的鏈接惟一性

Java架構資料,獲取方式

關注+轉發後,私信回覆關鍵詞 【架構】便可獲取以上價值1.8w的全套資料及視頻

重要的話講兩遍,轉發、轉發後再發私信,才能夠拿到哦!

相關文章
相關標籤/搜索