Race condition issue in PHP/MySQL -


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