首先,我理解的多人同時進行修改即為併發修改,根據併發的不同層面可以分為:執行緒級,程序級,應用級,下面針對不同層面有不同的控制策略:
執行緒級,也就是我們平時所謂的多執行緒程式設計,最簡單的方式就是使用synchronize關鍵字或者Lock類等進行悲觀鎖操作,這種方式對於資源衝突不明顯的場景會讓執行緒進行不必要的等待。所以如果衝突只是小機率事件,可以考慮使用juc包中的atomic類透過cas實現樂觀鎖;
程序級,這裡的程序級指的是分散式部署下的多例項,這種場景的特點是執行的程式碼是一樣的,所以遵循著同樣的計算規則,一般採用外部中介軟體進行併發控制,可以考慮借用redis、zookeeper等中介軟體實現分散式鎖;
應用級,所謂應用級就是完全不同的兩個應用,這種情況分兩種情況,一種是彼此事先約定鎖的規則或使用公用的元件進行資料庫訪問,參考程序級;另一種情況則是透過資料庫層來進行控制,包括使用for update進行行鎖,以及透過update x set y =z where id=abc and y={修改前的值}(這時候其實是透過程式設計規範來約定)。
首先,我理解的多人同時進行修改即為併發修改,根據併發的不同層面可以分為:執行緒級,程序級,應用級,下面針對不同層面有不同的控制策略:
執行緒級,也就是我們平時所謂的多執行緒程式設計,最簡單的方式就是使用synchronize關鍵字或者Lock類等進行悲觀鎖操作,這種方式對於資源衝突不明顯的場景會讓執行緒進行不必要的等待。所以如果衝突只是小機率事件,可以考慮使用juc包中的atomic類透過cas實現樂觀鎖;
程序級,這裡的程序級指的是分散式部署下的多例項,這種場景的特點是執行的程式碼是一樣的,所以遵循著同樣的計算規則,一般採用外部中介軟體進行併發控制,可以考慮借用redis、zookeeper等中介軟體實現分散式鎖;
應用級,所謂應用級就是完全不同的兩個應用,這種情況分兩種情況,一種是彼此事先約定鎖的規則或使用公用的元件進行資料庫訪問,參考程序級;另一種情況則是透過資料庫層來進行控制,包括使用for update進行行鎖,以及透過update x set y =z where id=abc and y={修改前的值}(這時候其實是透過程式設計規範來約定)。