在不给我的消费者带来麻烦的情况下防止丢失更新问题

时间:2019-04-24 18:38:28

标签: rest architecture software-design distributed-system distributed-transactions

我有一套相当简单的API

GET /documents
GET /documents/:id
PATCH /documents/:id

为防止出现“丢失更新”问题,我想在Etag上发回GET /documents/:id,然后要求在If-Match的{​​{1}}标头中发送该值}请求。然后,我将查询我的数据库,根据结果生成一个PATCH,并检查Etag是否与用户传入的内容匹配,以确定记录是否在其下面未更新。这里很普通。

我的问题与Etag通话有关。如果消费者致电GET /documents来获取其所有文档,找到他们想要更新的文档,那么他们将不得不向GET /documents发出呼叫以获取该记录的GET /documents/:id,然后他们最终可以发出Etag通话。

我很好奇其他人为避开对PATCH /documents/:id的此额外调用只是为了获得GET /documents/:id,却仍然防止了“丢失更新”问题?

1 个答案:

答案 0 :(得分:0)

在适当的情况下,除了将 import React, { Component } from 'react' import { bindActionCreators } from 'redux' // new import, see below import { connect } from 'react-redux' import { BrowserRouter as Router, Route } from 'react-router-dom' import { addDataAction } from './components/actions/addDataAction' class App extends Component { componentDidMount(){ this.props.actions.addDataAction() // calling addData on mounting } render() { return ( <Router> <div className="App"> <div className="wrapper"> <Header /> <main> {console.log(this.props.data.tshirts)} </main> </div> <Footer /> </div> </Router> ) } } const mapStateToProps = state => ({ data: state.data }) const mapDispatchToProps = dispatch => { return { actions: bindActionCreators({ addDataAction }, dispatch) } } export default connect(mapStateToProps, mapDispatchToProps)(App); 包含在标题中之外,还应将其包含在文档中。这样既可以节省往返时间,又可以使客户端在本地将文档持久保留在初始调用范围之外时更容易访问Etag