php mysql 防并发加锁事务处理
2017-12-21 14:35
411 查看
1、背景:现在有这样的需求,插入数据时,判断test表有无username为‘mraz’的数据,无则插入,有则提示“已插入”,目的就是想只插入一条username为‘mraz’的记录。2、一般程序逻辑如下:
$conn = mysqli_connect('127.0.0.1', 'root', '111111') or die(mysqli_error()); mysqli_select_db($conn, 'mraz'); $rs = mysqli_query($conn, 'SELECT count(*) as total FROM test WHERE username = "mraz" '); $row = mysqli_fetch_array($rs); if($row['total']>0){ exit('exist'); } mysqli_query($conn, "insert into test(username) values ('mraz')"); var_dump('error:'.mysqli_errno($conn)); $insert_id = mysqli_insert_id($conn); echo 'insert_id:'.$insert_id.'<br>'; mysqli_free_result($rs); mysqli_close($conn);3、一般少量请求的时候,程序逻辑不会有问题。但是一旦高并发请求执行的话,程序并没有按预期执行,会插入多条username为‘mraz’的记录。4、解决方案:利用mysql的FOR UPDATE 语句和事务的隔离性。注意的是FOR UPDATE仅适用于InnoDB,且必须在事务(BEGIN/COMMIT)中才能生效。调整代码后如下:
$conn = mysqli_connect('127.0.0.1', 'root', '111111') or die(mysqli_error()); mysqli_select_db($conn, 'mraz'); mysqli_query($conn, 'BEGIN'); $rs = mysqli_query($conn, 'SELECT count(*) as total FROM test WHERE username = "mraz" FOR UPDATE'); $row = mysqli_fetch_array($rs); if($row['total']>0){ exit('exist'); } mysqli_query($conn, "insert into test(username) values ('mraz')"); var_dump('error:'.mysqli_errno($conn)); $insert_id = mysqli_insert_id($conn); mysqli_query($conn, 'COMMIT'); echo 'insert_id:'.$insert_id.'<br>'; mysqli_free_result($rs); mysqli_close($conn);5、再利用php的curl模拟高并发请求该php脚本,查看数据库会只有一条username为‘mraz’的记录。达到程序执行的预期结果Thinkphp5使用实例:判断是否存在相同的数据,存在则直接返回,不存在则执行Db::startTrans();$sql = 'select count(*) as count from xs_reward_order where status <> 2 and user_id='.$user_id.' and task_id='.$data['task_id'].' FOR UPDATE';$res = Db::query($sql);if($res[0]['count'] > 0){return returnJson('',205, '您已接取过!请移步到个人中心接取任务中完成它吧');}Db::commit();
相关文章推荐
- PHP_MySQL高并发加锁事务处理
- php的mysql事务处理,针对高并发
- PHP_MySQL高并发加锁事务处理
- [MySQL]对于事务并发处理带来的问题,脏读、不可重复读、幻读的理解
- php与mysql事务处理
- PHP与MYSQL事务处理
- php mysql 事务处理
- PHP与MYSQL事务处理
- 如何处理PHP和MYSQL的并发以及优化
- PHP PDO事务处理及MYSQLengine=InnoDB
- PHP与MYSQL事务处理
- PHP中PDO的MYSQL事务处理实例
- 解析php mysql 事务处理回滚操作(附实例)
- PHP与MYSQL事务处理
- PHP与MYSQL事务处理
- php+Mysqli利用事务处理转账问题实例
- PHP与MYSQL事务处理
- php中mysql的事务处理
- PHP+Mysql基于事务处理实现转账功能的方法
- PHP多进程与MySQL的高并发瓶颈处理