數據一致性處理
當多個進程同時操作同一個數據,會產生資源爭搶,數據一致性的問題。
高併發情況下,涉及到寫操作時,不可能直接操作數據庫,大併發的連接會導致mysql請求會阻塞,比如大量的insert update 請求到,會直接導致無數的行鎖和表鎖,甚至最後堆積很多,從來觸發too many connections 錯誤。
web服務器 nginx和apache連接的進程有限,cpu上下文進程切換也會增加額外的開銷,所以響應一定快。
這時可以採用
高併發下的數據安全,防超發,以搶票系統爲例:
(1)消息隊列:
將票數資源存在redis中,將請求存入消息隊列(redis下的list阻塞的,可以實現消息隊列,還可以實現優先消息隊列)中,依次處理。缺點 :這樣會處理比較慢,等待時間比較長。
:對於讀操作是否也進入隊列,這個問題根據具體的場景,像12306應該是不在隊列中或者是優先排在最前面的,因爲只是讀,要求塊。
(2)加鎖
常見的鎖: 排它鎖;樂觀鎖;悲觀鎖;
排他鎖:在進行寫時,禁止一切的讀和寫;
樂觀鎖:認爲在寫的時候,別人不在寫,維護一個version號,等處理後對照version好,一致則對,否則回滾,操作不成功,
悲觀鎖:認爲在寫的時候,別人也在寫。採用數據庫提供的鎖機制:在寫操作的時(insert updata 等)myisam默認是鎖表,innodb根據是否是主鍵,主鍵則行鎖,否則表鎖。讀操作,innodb採用mvcc。
可以採用樂觀鎖+回滾:
採用悲觀鎖: