併發入庫面臨重複數據的問題

併發入庫面臨重複數據的問題

以User類爲例,當添加一個用戶時,首先會去判斷用戶是否已經存在(即username是否已經在數據庫中了),若是沒有,則insert一條用戶數據,若是有,則提示用戶名已存在。數據庫

將這個操做看做函數:UserService.saveUser(User user),有3個步驟:安全

private int saveUser(User user) {
  if
(1.username不存在) {     // 2.入庫;   } else {     // 3.提示用戶名已存在;   }
}

這個saveUser函數其實是線程不安全的,假設兩個線程A和線程B,兩個線程同時進行了判斷(步驟1),發現username不存在,那麼就會致使user表中插入了兩個username同樣的數據(步驟2)。併發

解決方案一分佈式

最直接的,經過添加synchronized關鍵字,將方法變成同步方法函數

優勢:簡單直接性能

缺點:性能問題;後期的維護成本較高;最終要的,當服務部署在多臺設備時不起做用spa


 解決方案二線程

在數據庫的user表中,將username字段設爲惟一索引,這樣當插入重複數據時,數據庫會拋出異常,沒法入庫,能夠經過異常處理的方式來處理code

優勢:從比較根源的數據庫層面解決了問題,適用與分佈式環境blog

缺點:須要關注異常處理

相關文章
相關標籤/搜索