Entify Framework 如何在高並發時避免重複插入數據?
07-11
例如:發送驗證碼的表,每次都會執行如下操作:
1,檢查當前電話號碼,上一次發送驗證碼的情況,是否剛剛發送過。
2,如果沒有發送過,則發送新的驗證碼。
此時,使用Entity Framework,由於「查詢」和「插入」操作無法做到「原子性」,會導致高並發(惡意刷介面)時,插入無效的數據。
可以用另外一張表來存儲 某段時間 (根據你的業務需求,多長時間裡對同樣的號碼不允許重複發送, 你還需要單獨的後台job, 維護這張表) 里發送過的驗證碼, 對電話號碼加上unique約束。
把這些操作放在一個transaction里:
- 插入 另外一張表
- 插入 原來的表
如果有重複的話,transaction會rollback.
一,查詢和插入的問題,這個存在一種叫查詢鎖,可以一定程度上解決你的問題,這種方案只能依賴於存儲系統(可能是db也可能是xml),老實來說生產環境應該儘可能避免此類設計。
二,關於你舉例的這個簡訊驗證碼問題,如果是我設計的話,使用redis存儲,用手機號作為key,值使用字典結構,時間為鍵,以及對應驗證碼,業務端檢驗時如果鍵值存在,則檢查鍵值時間範圍
可以設置 Transaction Isolation Levels = READ COMMITTED 來在防止dirty read.
PS: 話說這種問題不是應該出現在Stack Overflow么
把手機號加入redis做鎖, 發完就刪除,可以用於分散式架構
Actor模型很適合這種並發下的ABA問題~
SELECT 加上UPDATE lock
推薦閱讀:
TAG:SQL | ASPNET | C | ASPNETMVC | EntityFramework |