zoukankan      html  css  js  c++  java
  • mysql 并发控制

    在做项目中的数据统计分析的时候,需要对访问量进行统计,对某个字段的累加,mysql处理累加的时候一般是先查询后加1,这样在大访问量的时候对于select与update的时候会出现数据的不准确性:

    伪代码如下 

    $data = select num from test where id=1;
    update test set num = $data['num']+1 where id=1;

    处理该问题要掌握的几个概念

    共享锁:读的时候不能写---s锁

    排他锁:写的时候不能读---x锁

    快照读:读取历史可见版本,不加锁,其他事务可修改该记录

    当前读:最新版本数据,并给该记录加锁,保证其他事物不会修改该记录

    脏读:一个事务读取到另一个事务中未提交的数据,这个事务回滚,形成脏读

    幻读:事务A读再次,一次事务B未提交,一次提交,形成幻读

    解决方法:

    1、加事务,mysql的事务隔离

    2、加锁

    伪代码如下:

    START TRANSACTION;

    $data = select num from test where id=1 for update;
    update test set num = $data['num']+1 where id=1;

    COMMIT;

    解释:

    mysql的select属于快照读,加上for update后读取的数据属于当前读,从而解决mysql update的并发控制

    If the copyright belongs to the longfei, please indicate the source!!!
  • 相关阅读:
    第二阶段冲刺第一天
    第一次团队绩效评估
    其他团队对本团队评价的总结
    对其他团队的评价
    团队博客的检查结果
    站立会议第十天
    站立会议第九天
    站立会议第八天
    站立会议第七天
    团队站立会议10
  • 原文地址:https://www.cnblogs.com/longfeiPHP/p/9274941.html
Copyright © 2011-2022 走看看