併發入庫面臨重複數據的問題
以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
缺點:須要關注異常處理