當讀寫分離遇到事務

2021-10-09 17:53:07 字數 938 閱讀 8413

為了避免頻繁建立構造成本大的物件,我們會選擇使用執行緒池、連線池這類池化技術來復用物件。復用物件意味著可能在共享乙個資源,如果前乙個使用者使用完沒有將物件屬性值重置為初始狀態的話,資料就錯亂了。池化技術還有一種隱患,異常沒有得到妥善處理,歸還的物件就不能復用,池中的可用物件很快就會耗盡,最終由於資源限制無法建立新物件,這個池子就會拒絕服務。

工作中,為了減輕資料庫主庫壓力,通常都進行讀寫分離。不過,當讀寫分離遇到資料庫連線池時,處理不當就有可能出現異常,比如讀操作正常在從庫上執行,寫操作卻也跟過來了。

讀寫分離實現有很多種方案,一般是通過配置資料庫註解切面攔截,不同的註解使用不同的資料來源。或者,通過持久化元件的外掛程式,識別方法名字首來決定要不要使用從庫。這樣就可以實現動態資料來源。

說到註解啊,不知道你習慣在持久化dao層,還是在服務service層使用快取、資料庫、事務這些註解呢?這個關乎著註解路徑掃瞄、架構分層。我見過很多在持久化dao層大量使用快取註解的情況,在架構演進過程中,資料庫操作被其他服務給代替了,不得不花費人力把操作快取和運算元據庫分離,它們兩個原本就不應該耦合。

還有一種操作也會引起錯亂。乙個讀介面和乙個寫介面,只有讀介面的方法標註了需要使用從庫,而寫介面的方法上沒有標註,其中某讀方法內部呼叫了寫方法,這樣即使有預設配置也會錯亂的。我們得在寫介面的方法也標註上才行。

那當讀寫分離遇到事務時,怎麼優雅處理呢?

我覺得,很多場景其實不需要事務的,我們人為地把架構搞複雜了。比如,我們可以這樣做,先寫副表再寫主表,副表失敗了頂多是髒資料,使用者重試後不出意外都會恢復的。有時讓使用者重試比很多複雜方案都靠譜。如果一定要用事務,那就得小心處理資料來源使用善後的問題。

總結來說,讀寫分離遇到連線池和事務都是有一些坑的,所以一般在非關鍵業務才採用讀寫分離,這樣也不用考慮寫完立即讀時主從複製延遲大怎麼辦。

mysql讀寫分離(三) 讀寫分離實現

現在的mysql讀寫分離方案有很多,在這裡筆者列舉出幾種自己使用過的方案 1.spring實現route不同的資料來源,來達到讀寫分離的目的。主要原理是根據service或者dao方法做切面,然後根據規範方法名字首來切換不同的資料來源,實現讀寫分離,好處,速度快,支援事務,但是缺點,是不好管理 2....

php mysql讀寫分離

關於mysql的讀寫分離有幾種方法 中介軟體,mysql驅動層,控制 關於中介軟體和mysql驅動層實現mysql讀寫分離的方法,今天暫不做研究,這裡主要寫一點簡單的 來實現由php 控制mysql的讀寫分離。準備工作 兩個mysql伺服器,已經配置好主從,如果沒配置過mysql主從 主伺服器192...

thinkphp mysql 讀寫分離

thinkphp提供了完善的讀寫分離功能,不需要手動切換資料庫。什麼時候讀,什麼時候寫系統會自動判斷。讀資料時系統會操作從伺服器,而寫資料時系統會操作主伺服器。最終由資料庫實現同步,這就是乙個最典型的資料庫讀寫分離,下以將配置好的兩台主從資料庫為例,詳細介紹實現讀寫分離。首先開啟專案下的資料庫配置檔...