鍍金池/ 問答/人工智能  Java  數(shù)據(jù)庫  HTML/ 查詢后判斷結(jié)果再進(jìn)行數(shù)據(jù)操作,如何在并發(fā)情況下既保證性能,也保證數(shù)據(jù)一致

查詢后判斷結(jié)果再進(jìn)行數(shù)據(jù)操作,如何在并發(fā)情況下既保證性能,也保證數(shù)據(jù)一致

問題描述

  1. 數(shù)據(jù)庫訂單表中每個(gè)用戶的記錄有15種狀態(tài)(12種狀態(tài)碼代表在途狀態(tài),3種狀態(tài)碼代表終結(jié)狀態(tài))。
  2. 數(shù)據(jù)之間的狀態(tài)可以進(jìn)行流轉(zhuǎn)。
  3. 要求同一個(gè)用戶的在途狀態(tài)只能有一條記錄,終結(jié)狀態(tài)可以有多條記錄。
  4. 如何保證數(shù)據(jù)完整性

問題出現(xiàn)的環(huán)境背景及自己嘗試過哪些方法

  1. 代碼流程,在插入數(shù)據(jù)庫之前進(jìn)行數(shù)據(jù)查詢,如果查詢出當(dāng)前用戶沒有在途狀態(tài)的數(shù)據(jù),則進(jìn)行插入;如果查詢出當(dāng)前用戶有在途狀態(tài)的數(shù)據(jù),則不插入。
  2. 但是在同一個(gè)用戶并發(fā)高的情況下,會(huì)出現(xiàn)數(shù)據(jù)不嚴(yán)謹(jǐn)?shù)那闆r,這個(gè)大家都知道。
  3. 如果是單節(jié)點(diǎn)的情況下,可以使用同步(synchronized)的方法解決數(shù)據(jù)完整性的問題,但是當(dāng)同步的時(shí)候也阻塞了其他所有用戶的操作,造成性能低下。

你期待的結(jié)果是什么?實(shí)際看到的錯(cuò)誤信息又是什么?

我期望哪位大神能給出一種比較好的解決方案,比同步(synchronized)的方法好,也能保證數(shù)據(jù)完整性。

期待!

回答
編輯回答
放開她

1:使用數(shù)據(jù)庫的唯一索引。
2:分布式鎖。

2018年7月8日 01:37