阿里二面的時候被問到的一個問題:面試
在spring的同一個事務內的多個方法,是怎麼保證使用的是同一個數據庫鏈接?原理是什麼?涉及框架中的哪些類,具體做用是什麼?舉出幾個例子。spring
最佳答案以下:數據庫
事務,是描述一組操做的抽象,好比對數據庫的一組操做,要麼所有成功,要麼所有失敗。編程
事務具備4個特性:安全
§ Atomicity(原子性)多線程
§ Consistency(一致性)架構
§ Isolation(隔離性)框架
§ Durability(持久性)線程
事務是否生效取決數據庫底層是否支持(好比MySQL的MyISAM引擎就不支持事務,Spring能奈何!),同時一個事務的多個操做須要在同一個Connection上。視頻
事務也每每是在業務邏輯層來控制。
寫一個獲得數據庫鏈接的管理類ConnectionManager
在Spring中,有時候咱們是否是要配置多個數據源DataSource?
很顯然,Spring須要經過DataSource來獲得操做數據庫的管道Connection。
這裏經過ConnectionManager類來完成這個過程,須要思考的是在多線程下,這顯然是存在問題的。
爲避免多線程問題,難道咱們採用線程安全的Map,好比ConcurrentHashMap,其實咱們真正的目的是什麼?
是保證一個線程下,一個事務的多個操做拿到的是一個Connection,顯然使用ConcurrentHashMap根本沒法保證!
Spring很聰明,她提供了一種思路,來解決,看下面的代碼!
原本線程不安全的,經過ThreadLocal這麼封裝一下,馬上就變成了線程的局部變量,不單單安全了。
還保證了一個線程下面的操做拿到的Connection是同一個對象!
這種思想,確實很是巧妙,這也是無鎖編程思想的一種方式!
最後寫一個TransactionManager,這樣咱們就能夠管理事務了。
Java架構資料,獲取方式
關注+轉發後,私信回覆關鍵詞 【架構】便可獲取以上價值1.8w的全套資料及視頻!
重要的話講兩遍,轉發、轉發後再發私信,才能夠拿到哦!