常人思维,判断是否重复就有对比,与之前的数据进行比较,完全相同则肯定是重复提交。那么如何获取之前的数据呢?
通常策略有两种:
1.持久化之前的数据,再次对比之前进行查询,优点是数据保存时间长,代码逻辑也十分简单。缺点是查询数据库存在在IO操作的瓶颈,在数据量小的时候没有任何问题,体量一大,几秒的查询时间,严重破坏用户体验。
2.维护一个缓存或者类似的区域,或者变量,设定过期时间。这种利用维护缓存区域的思维就是为了解决查询效率低下的问题,它的优点显而易见,查询效率高,反馈用户及时。
根据以上两种策略的具体方案有如下:
1.持久化数据。
1.1 最简单的就是把前台获取的数据拿到数据库一一对比,很显然这是个很傻吊的操作,不做讨论。
1.2 给数据表建立一个状态字段,插入或者更新数据的时候维护这个字段。如果这个字段已经被更新,数据库就不会新增加数据。
update T set ID=ID where id = 单据id AND rec_status = ‘未提交’
有个问题是高并发的时候可能存在该数据已经被更新但我们获取的值却是未更新,这里主要涉及到数据库的脏数据问题。
1.3 维护一个全局变量。在整个系统维护一个全局变量,把前一个操作放进变量中,设定过去时间。每次提交的时候进行查询对比,通过后更新这个变量。通常的解决方案采用session,不过应该只能防止一人的重复提交行为。防止多人重复提交同一个数据,需要维护一个全局的共有变量,当然这种业务案例应该很少,维护全局变量的风险也非常大 ,面临丢失,被篡改等。
1.4 维护一个缓存,应该是现在业界通用的一个方法。当前比较火的redis,当然还有其他缓存机制和工具,具体的实现暂不做介绍了。