当前位置:七道奇文章资讯数据防范MySQL防范
日期:2012-06-02 15:06:00  来源:本站整理

mysql 行列 实现并发读[MySQL防范]

赞助商链接



  本文“mysql 行列 实现并发读[MySQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
一个 MySQL 表可以看做是一个行列,每一行为一个元素.每次查询得到满意某个条件的最前面的一行,并将它从表中删除大概改变它的状况,使得下次查询不会得到它.在没有并发拜候的情形下,简单地用 SELECT 得到一行,再用UPDATE(大概DELETE)语句改正之,便可以实现.
复制代码 代码以下:
SELECT * FROM targets WHERE status='C' LIMIT 1;
UPDATE targets SET status='D' WHERE id='id';

假若有并发拜候,在SELECT和UPDATE语句之间大概会存在其他地SELECT查询,招致同一行被取出多次.为了保证在并发情形下仍旧能正常工作,一种思绪是利用数据库地锁来避免,就像在多线程环境下所做地一样.总之,如果的查询和改正成一个原子操作,不被别的的拜候干扰.MySQL 5 支持存储历程,可以用它来实现.
单条 UPDATE 语句应当原子操作的,可以操纵这个特点来保证并发拜候情形下行列的正常工作.每次取元素时,先用 UPDATE 改正符合条件的第一行,然后再得到该行.惋惜 UPDATE 语句没有返回值,重新用普通的SELECT的话又很难找到刚被改过的那条记录.
这里用到一个小本领:在 UPDATE 时加上 id=LAST_INSERT_ID(id),再用 SELECT LAST_INSERT_ID() 便可得到刚改正的那条记录的id.还有一个问题,当表中不存在符合条件的记录,招致 UPDATE 失利时,LAST_INSERT_ID() 会保存本来地值不变,因而不能辨别行列中能否还有元素.
ROW_COUNT() 返回上一个语句影响的行数,把它作为 SELECT 的一个条件,可以帮忙办理这个问题.
最后,支持并发拜候的完好办理筹划为:

复制代码 代码以下:
UPDATE targets SET status='D', id=LAST_INSERT_ID(id) WHERE status='C' LIMIT 1;
SELECT * FROM targets WHERE ROW_COUNT()>0 and id=LAST_INSERT_ID();

更新:在实现带优先级的行列时这种办法有问题,带有 ORDER BY ... 条件的 UPDATE 语句非常慢,比方:

复制代码 代码以下: UPDATE targets SET status='D' WHERE status='C' ORDER BY schedule ASC LIMIT 1;


而单独查询和更新则是很快的:
复制代码 代码以下:
SELECT id FROM targets WHERE status='C' ORDER BY schedule ASC LIMIT 1;
UPDATE targets SET status='D' WHERE id='id';


本来这是MySQL的Bug-12915,一年多从前提出来的,固然关闭了,却只办理了部份问题,尚不支持WHERE,见MySQL 5.0.15 的 Changlog.无奈,上面这种巧妙的办法也没有实用代价了.
最后采取了一种折衷筹划,以下:

复制代码 代码以下:
UPDATE targets, (SELECT id FROM targets WHERE status='C' AND schedule<CURRENT_TIMESTAMP ORDER BY schedule ASC LIMIT 1) tmp SET status='D' WHERE targets.id=LAST_INSERT_ID(tmp.id);
SELECT * FROM targets WHERE ROW_COUNT()>0 and id=LAST_INSERT_ID();   以上是“mysql 行列 实现并发读[MySQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • Windows 搭配 IIS7 PHP MySQL 环境
  • mysql Out of memory (Needed 16777224 bytes)的错误办理
  • mysql提醒[Warning] Invalid (old?) table or database name问题的办理办法
  • mysql启用skip-name-resolve情势时呈现Warning的处理办法
  • mysql启用skip-name-resolve情势时呈现Warning的处理办法
  • MySQL Order By语法介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • mysql数据库插入速度和读取速度的调整记录
  • MySQL Order By索引优化办法
  • MySQL Order By用法分享
  • mysql #1062 –Duplicate entry ''1'' for key ''PRIMARY''
  • MySQL Order By Rand()效率解析
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .