MySQL唯讀事務到底有啥用?

2021-10-16 22:08:47 字數 897 閱讀 9030

很多人認為mysql唯讀事務沒啥用,有點雞肋,以前我也這麼認為,自從認真研究了事務的隔離級別和事務的併發問題後,發現這個唯讀事務其實並不是大家想象的那麼無用。下面舉乙個實際開發中可能會遇到的例子來說明唯讀事務的作用。

展示使用者列表的需求,後台從資料庫查詢使用者列表返回給前端分頁展示,分頁通過資料庫的分頁功能實現,前端分頁外掛程式需要後台返回總共有多少條記錄,以便渲染分頁效果,後端返回的資料大概長這樣:

所以後台需要查詢兩次資料庫:查詢總數和查詢列表。(有人會說,就不能全部查詢出來再在**裡通過sublist分頁嗎?我這個例子裡只有18條資料,萬一有180萬條資料呢,全部載入到記憶體不怕記憶體溢位嗎?)

假設我第一次查詢總數返回的是18條,結果在我第二次查詢列表的時候資料表中插入了一條使用者資料,然後我剛好查詢的是第二頁的資料,原本是有8條資料,結果現在查到了9條。然後就在頁面看到了神奇的一幕:總共18條資料,按照每頁顯示10條來分頁,結果第二頁有9條資料,這不是有毛病麼?

是的,上述情景就是典型的不可重複讀問題。我們都知道有個事務隔離級別叫「repeatable read」,此隔離級別可以實現可重複讀,但是別忘了事務的隔離級別前提是要有事務啊,兩個查詢語句都沒有處於事務中,還談啥事務的隔離級別啊?還談啥可重複讀啊?這個我還真做過實驗,就算事務的隔離級別是可重複讀級別,兩個查詢語句沒有處於事務中時,還是會出現不可重複讀問題。

所以在repeatable read隔離級別下需要結合事務才能實現可重複讀,而唯讀事務讀寫事務更高效,因為不需要寫資料,所以做了一些優化。沒錯,唯讀事務就是這麼來的。

還有人說唯讀事務不能進行寫操作,這確實沒錯,但我認為不能寫是結果而不是目的。

裝飾器到底有啥用?

我們要增強乙個已經完成的函式的功能,比如,在now 函式呼叫前後自動列印日誌,但又不希望修改now 函式的定義,這種在 執行期間動態增加功能的方式,稱之為 裝飾器 decorator 本質上,decorator就是乙個返回函式的高階函式。def log func def args,kw print ...

物件的 可列舉 到底有啥用?

可列舉屬性有什麼作用?用在什麼場景下,什麼業務下?var god var news methods 然後我們可以這樣訪問 god.extends name news god.name.methods.show 看我們前面的 god是乙個母物件,意思就說我們協作開發,一般由專案組長或技術經理來開發go...

牛逼哄哄的 RabbitMQ 到底有啥用?

mq全稱為message queue,訊息佇列 mq 是一種應用程式對應用程式的通訊方法。應用程式通過讀寫出入佇列的訊息 針對應用程式的資料 來通訊,而無需專用連線來鏈結它們。訊息傳遞指的是程式之間通過在訊息中傳送資料進行通訊,而不是通過直接呼叫彼此來通訊,直接呼叫通常是用於諸如遠端過程呼叫的技術。...