在MySql数据库中有一个存储过程,功能是:先查询table_user表中uid的最大值,然后把最大值加1,生成新的uid,最后把新生成的uid插入table_user表中。
我在php程序中会调用这个存储过程,取得这个新生成的uid值。
现在的问题是,我要在php文件中加锁,以保证多个用户同时调用这段操作时,不会发生错误。
请问,有没有什么好的方法??

解决方案 »

  1.   

    哦。
    1、是否可以都写在一个存储过程里吗?那样可以直接用事务。
    2、是否可以设置table_user中的uid为主键,然后插入失败的话,重新调用存储过程生成新的uid。
    3、将用户的操作做成队列的形式,一次调用一个。(可以单独一个表,将用户的请求放进去,然后有个程序循环去取这个表的第一条,呵呵)
    简单说点想法哈。
      

  2.   

    我想问一下,以我的思路,怎么能在php中加锁来确保不出问题呢?
      

  3.   

    MySql数据库怎么起事务呢??
      

  4.   

    确保自己的MySQL服务器版本大于 4.1然后用标准SQL语句来起事务
    begin tran
    rollback(回滚)
    commit(完成事务)还是不解的话,具体怎么做你去google或者baidu一下“Mysql 事务处理”
      

  5.   


    function getLock ($tablename)
    {
    ignore_user_abort(true);
    $fp = fopen($this->datadir . $tablename.'.lock','w');
    if (!flock($fp, LOCK_EX)) {
       // log error?
    }
    $this->loadTable($tablename);
    return $fp;
    }

    /** Release a lock
     * @access private
     */
    function releaseLock ($lockfp)
    {
    flock($lockfp, LOCK_UN);
    ignore_user_abort(false);
    }
    $lockfp = $this->getLock($tablename);
    $rows = $this->selectWhere($tablename, null, 1, 
    new OrderBy($idField, DESCENDING, INTEGER_COMPARISON));
    if ($rows) {
    $newId = $rows[0][$idField] + 1;
    } else {
    $newId = 1;
    }
    $newRow[$idField] = $newId;
    $this->tables[$tablename][] = $newRow;
    $this->writeTable($tablename);
    $this->releaseLock($lockfp);}这就是一个加锁和解锁的例子,摘自 See http://lukeplant.me.uk/resources/flatfile/ for documentation and examples