i wrote bash script tries send post requests website. in post request handler on website have logic like:
$std = new \stdclass(); $std->ok = false; $order = getorderbyid(id); // table: orders $user_id = user_id; if (!empty($order)) { if (!orderisntperformedbyuser($user_id, $order->id)) { // table: performed_orders updateuserdata($user_id, ['user_balance', 'user_balance+1']); // table: users performorderbyuserid($order->id, $user_id); // table: performed_orders } } echo json_encode((array)$std); return; bash script:
for in {1..5} curl 'http://example.com/handlepostrequest' --form-data="id=1" & done it sends 5 post requests in background , website responses instantly. requests execute @ same time , few of requests receive "true" response server.
i think need use transaction mechanism avoid situation? or how delay between user requests avoid it? what's best way fix it? tried action similar websites , got delay between requests.
thanks , sorry bad english.
i'll expand on comment. you're doing things wrong on server. you're using php validate whether order in database, php script not data authority - mysql is. mysql's job take care of data. requirement insert table, , if record exists order_id - update current_balance.
this achieved placing unique key on order_id. query looks this:
insert orders (order_id, current_balance) values (1, 13.37) on duplicate key update current_balance = current_balance + 333.333 benefits of approach:
- database takes care of data (that's job)
- concurrency problems won't occur
- data integrity preserved
- you have less code take care of
Comments
Post a Comment