以前文章總結一下事務的原理

 今晚學習了網易微專業的公開課,講的是事務的相關的問題。這裏寫一篇文章記錄一下。

 # # 先看一下一個簡單版的 spring 的事務原理全貌圖

 

  對於事務問題,之前都是一知半解。

  之前別人一提到事務,我就想到了ACID。我知道開始事務的註解,知道想要使用註解的時候,就在service層類上添加一個註解@Transactional。我以爲這樣我就知道事務了。但是我不知道我還不知道很多。

  拋出來第一個問題:那麼數據庫是通過什麼來識別是一個事務的?原理是什麼?或者說本質是什麼?有沒有想過,數據庫是怎麼識別到底哪些sql 是同一個事務呢?如果讓你自己來處理事務,你準備怎麼寫呢?

  首先回答一下上邊的一個問題:數據庫和程序交互,是通過同一個數據庫連接來判斷是不是同一個事務的。如果不用spring給我們提供的事務,讓我們自己來實現,其實就是創建一個數據庫連接,創建一個事務,然後設置上不要自己提交事務,也就是手動提交,然後再處理,比方說寫了一組sql,然後都執行完了就提交事務,如果發生了問題就回滾。

  另外一個問題,如果不同的線程來訪問,對於一個數據庫連接,是不是事務就失去了隔離性。那麼判斷同一個數據庫鏈接的,應該放在哪裏?不妨學學框架,框架是放在一個TransactionalManager 容器裏邊,並且這個使用 ThreadLocal 修飾的。ThreadLocal 最大的作用就是用來防治不同的線程訪問到同一個變量。使用了ThreadLocal  以後,就解決了不同線程破壞事務隔離的問題。源碼裏邊的 TransactionalManager  也是用來存放數據庫連接的。

  每次都通過創建一個事務,最後再提交的方式,能解決問題,但是是不是太粗魯了?一點都不優雅。想想spring 的 AOP,通過切面的形式,就恰好能幫我們優雅的解決這個問題。就是環繞通知,在方法執行前,創建一個事務,然後方法執行後提交事務。想一下,我們在使用事務的時候,是不是就添加了一個註解@Transaction,其實這個註解就是一個標示,然後在AOP處理裏邊做一個判斷,只要是 用了@Transaction的方法,就統統進行事務的處理。

  到這裏就結束了。只不過spring實現的事務,解決更多的問題,更復雜的問題,比方事務的傳播呀,等等

   

   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章