mysql多線程并發(fā)讀寫 多個線程可以讀一個變量,只有一個線程可以對這個變量進行寫,到底要不要加鎖?
多個線程可以讀一個變量,只有一個線程可以對這個變量進行寫,到底要不要加鎖?下面簡要解釋一下原因:鎖定是因為操作不是原子的。讓我們用操作一來解釋它??聪旅鎯蓚€圖。我這個操作需要看上面的第二個圖,你能很清
多個線程可以讀一個變量,只有一個線程可以對這個變量進行寫,到底要不要加鎖?
下面簡要解釋一下原因:
鎖定是因為操作不是原子的。讓我們用操作一來解釋它??聪旅鎯蓚€圖。
我這個操作需要
看上面的第二個圖,你能很清楚地理解這個過程嗎?
鎖定是為了確保上述三個步驟是原子操作。
回到問題上來,只有一個線程要寫,沒有競爭,所以不需要鎖定。
但是,如果你看第一張圖片,因為主內存和本地內存的存在
在一個線程寫入后,其他線程無法立即看到它。這就是可見性問題。
添加volatile關鍵字后,它將在操作后強制工作內存和主內存同步,以確保其他線程可以立即看到它。
MySQL主從復制能完美解決數據庫的單點問題嗎?為什么?
使用主從時,實際上放棄了強一致性。由于受試者只問一個問題,我們不考慮訪問次數的問題。換句話說,假設主從復制可以完全支持當前的系統(tǒng)訪問。)
通用數據庫主從設置:
主數據庫可以讀寫
即系統(tǒng)可以同時從主數據庫和從數據庫獲取數據。數據寫入主庫后,會自動同步到從庫。
這構成了一個簡單的分布式系統(tǒng)。根據cap定理,三個中只能選擇一個。如果一致性很強,則不會提高系統(tǒng)的可用性,反而會降低系統(tǒng)的可用性。
讓我們看看上面的主從結構中可能出現什么問題:
系統(tǒng)寫入主數據庫,然后從主數據庫進行查詢。這是一個單點數據庫,沒有影響。
-如果數據已同步,則沒有影響
-如果數據未同步,則會查詢舊數據
-如果同步有問題,則會斷開主設備和從設備的連接。如果系統(tǒng)無法感知它,那么查詢可能總是舊數據。這里我們需要監(jiān)視同步。當同步出現問題時,我們應該及時處理
掛斷庫。主數據不能與從數據同步。如果主從交換機是自動的,單點故障的概率只會降低50%(如果主數據庫或備用數據庫發(fā)生故障,并且沒有人恢復)。