業務描述:
首先從數據中查找最近的一條訂單數據,然后將之前的訂單號碼+1作為新的訂單號碼,插入到數據庫當中。(需求不能改變)
當出現並發操作時,A從數據庫中獲取最近一條訂單的訂單號為N,這是A還沒有完成新訂單的插入操作。B用戶進來,也獲取最近一條訂單的訂單號為N,這是A和B 想數據庫同事插入的訂單就有相同的訂單號碼。
解決方法1:
程序用同步鎖控制(synchronized),性能急劇下降了,本身 java 就是多線程的,你把它單線程使用,不是明智的選擇,同時,如果分布式部署的時候,加了 synchronized 也無法控制並發。
解決方法2:
redis 自增。將訂單號自增字段,交給redis管理。
解決方法3:
樂觀鎖:(可能睡涉及到多次提交,用戶體驗性差)。
解決方法4:
數據庫行鎖:行鎖的同時,可能會影響其他程序對數據庫的操作。
解決方式5:
數據庫(唯一性約束UNIQUE KEY),由於訂單號不能重復,當插入相同的訂單號碼,就會產生錯誤。