dousi8931 2011-08-10 20:06
浏览 67
已采纳

锁定MySQL中的最大值

I am using the following query on MySQL using PHP

$sql = SELECT MAX(SrNo) FROM cart;
$result = mysql_query($sql);

The structure of table CART is

CART (SrNo int(10));

Now I am using the result to do some kind of processing and inserting the maximum value into this table by incrementing one. My problem is that if user1 has got the maximum value of SrNo and is in-between the processing. During this time user2 also requests the server got the same maximum value of SrNo as user1 got and starts processing.

Now when both are done with the processing + insertion into the table, I will have two duplicates in the table CART. How can I prevent this from happening?

In other words, I want no one else to get the maximum value of SrNo until unless one user is finished doing its processing.

  • 写回答

3条回答 默认 最新

  • douruoshen1449 2011-08-10 21:26
    关注

    wouldn't you be fine with the AUTO_INCREMENT feature for PRIMARY KEY?

    create table cart ( SrNo int(10) AUTO_INCREMENT PRIMARY KEY ) ENGINE = InnoDB;
    

    then just simply insert new lines and it will automatically increment the new values. That would probably very easily do the trick you are (maybe?) trying to do.

    But if you need to lock the maxmium, you can do this:

    start transaction;
    select max(SrNo) from cart for update;
    /* do some other stuff, insert the max value + 1 etc... */
    commit;
    

    Remember: You should use transaction for any operation which is not 1 single query!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题