浅谈C#在网络波动时防重复提交的方法-创新互联
前几天,公司数据库出现了两条相同的数据,而且时间相同(毫秒也相同)。排查原因,发现是网络波动造成了重复提交。
成都创新互联长期为千余家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为伊金霍洛企业提供专业的成都网站制作、成都做网站、外贸营销网站建设,伊金霍洛网站改版等技术服务。拥有十多年丰富建站经验和众多成功案例,为您定制开发。由于网络波动而重复提交的例子也比较多:
网络上,防重复提交的方法也很多,使用redis锁,代码层面使用lock。
但是,我没有发现一个符合我心意的解决方案。因为网上的解决方案,第一次提交返回成功,第二次提交返回失败。由于两次返回信息不一致,一次成功一次失败,我们不确定客户端是以哪个返回信息为准,虽然我们希望客户端以第一次返回成功的信息为准,但客户端也可能以第二次失败信息运行,这是一个不确定的结果。
在重复提交后,如果客户端的接收到的信息都相同,都是成功,那客户端就可以正常运行,就不会影响用户体验。
我想到一个缓存类,来源于PetaPoco。
Cache
public class Cache{ private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(); private readonly Dictionary _map = new Dictionary (); public int Count { get { return _map.Count; } } public TValue Execute(TKey key, Func 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(); } } }
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
分享标题:浅谈C#在网络波动时防重复提交的方法-创新互联
文章链接:http://cdiso.cn/article/dcccec.html