前幾天,公司數(shù)據(jù)庫出現(xiàn)了兩條相同的數(shù)據(jù),而且時間相同(毫秒也相同)。排查原因,發(fā)現(xiàn)是網(wǎng)絡波動造成了重復提交。

由于網(wǎng)絡波動而重復提交的例子也比較多:

網(wǎng)絡上,防重復提交的方法也很多,使用redis鎖,代碼層面使用lock。
但是,我沒有發(fā)現(xiàn)一個符合我心意的解決方案。因為網(wǎng)上的解決方案,第一次提交返回成功,第二次提交返回失敗。由于兩次返回信息不一致,一次成功一次失敗,我們不確定客戶端是以哪個返回信息為準,雖然我們希望客戶端以第一次返回成功的信息為準,但客戶端也可能以第二次失敗信息運行,這是一個不確定的結(jié)果。
在重復提交后,如果客戶端的接收到的信息都相同,都是成功,那客戶端就可以正常運行,就不會影響用戶體驗。
我想到一個緩存類,來源于PetaPoco。
Cache<TKey, TValue>代碼如下:
public class Cache<TKey, TValue>
{
private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim();
private readonly Dictionary<TKey, TValue> _map = new Dictionary<TKey, TValue>();
public int Count {
get { return _map.Count; }
}
public TValue Execute(TKey key, Func<TValue> factory)
{
// Check cache
_lock.EnterReadLock();
TValue val;
try {
if (_map.TryGetValue(key, out val))
return val;
} finally {
_lock.ExitReadLock();
}
// Cache it
_lock.EnterWriteLock();
try {
// Check again
if (_map.TryGetValue(key, out val))
return val;
// Create it
val = factory();
// Store it
_map.Add(key, val);
// Done
return val;
} finally {
_lock.ExitWriteLock();
}
}
public void Clear()
{
// Cache it
_lock.EnterWriteLock();
try {
_map.Clear();
} finally {
_lock.ExitWriteLock();
}
}
}另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
當前名稱:淺談C#在網(wǎng)絡波動時防重復提交的方法-創(chuàng)新互聯(lián)
鏈接分享:http://www.chinadenli.net/article42/dcccec.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設、搜索引擎優(yōu)化、關(guān)鍵詞優(yōu)化、軟件開發(fā)、Google、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)