java 高並發 訂單編號遞增(解決方案)


業務描述:

  首先從數據中查找最近的一條訂單數據,然后將之前的訂單號碼+1作為新的訂單號碼,插入到數據庫當中。(需求不能改變

  當出現並發操作時,A從數據庫中獲取最近一條訂單的訂單號為N,這是A還沒有完成新訂單的插入操作。B用戶進來,也獲取最近一條訂單的訂單號為N,這是A和B 想數據庫同事插入的訂單就有相同的訂單號碼。

 

解決方法1:

  程序用同步鎖控制(synchronized),性能急劇下降了,本身 java 就是多線程的,你把它單線程使用,不是明智的選擇,同時,如果分布式部署的時候,加了 synchronized  也無法控制並發。

 

解決方法2:

  redis 自增。將訂單號自增字段,交給redis管理。

 

解決方法3:

  樂觀鎖:(可能睡涉及到多次提交,用戶體驗性差)。

 

解決方法4:

  數據庫行鎖:行鎖的同時,可能會影響其他程序對數據庫的操作。

 

解決方式5:

  數據庫(唯一性約束UNIQUE KEY),由於訂單號不能重復,當插入相同的訂單號碼,就會產生錯誤。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM