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!!!
  • 相关阅读:
    .dll .h .lib等文件的作用与区别
    [转自]语言黑客的福音
    [转载]一个台湾程序员的心历路程
    Servlet学习总结
    会话跟踪(Cookie & Session)
    JSP学习总结
    人往高处走,水往低处流
    GDI 和GDI+ 混合编程
    常用到的知识
    Sqlite3相关
  • 原文地址:https://www.cnblogs.com/longfeiPHP/p/9274941.html
Copyright © 2011-2022 走看看