我们的web应用程序的结构是3层。(表示层、业务层、数据库层)
所有业务逻辑都在业务层中
表示层向业务层请求CRUD,并得到处理用户请求的结果
顺便说一下,我们在表示层配置了读取超时。(3秒)
在这种情况下,如果一些结果缓慢地来自业务层,则用户将收到错误消息,CRUD处理将正确完成。所以用户再次尝试操作。结果,数据被复制
如何解决这个问题?只是增加阅读时间?
对于业务层中长时间运行的事务,您应该在表示层上实现类似COMET的机制:
- 用户提交交易,业务层立即返回
- 事务在业务层的后台执行
- 表示层定期轮询业务层以检查事务的状态
不幸的是,这种机制通常需要在表示层和业务层中进行一些重大的实现更改。在客户端,javascript框架提供了这些开箱即用的功能。在服务器端,servlet 3.0中的异步servlet可能会有所帮助。
单独增加读取超时很简单,但在大多数情况下不会让你摆脱这种情况:如果客户端请求通过代理/防火墙等,后者可能会在Presentation Layer之前超时并关闭连接。
如果达到超时,则实现回滚,或者如果在超时之前完成,则仅提交数据库事务。增加超时并不能解决任何问题。
最好的选择实际上是让客户端接收请求的确认,然后(稍后)确认完成或失败。这涵盖了除了失去联系或工作非常缓慢之外的典型情况。
增加超时是明智的——3秒的超时对于大多数严肃的工作来说是不现实的(如果服务器暂时繁忙或网络延迟怎么办?)。