在MySql数据库中有一个存储过程,功能是:先查询table_user表中uid的最大值,然后把最大值加1,生成新的uid,最后把新生成的uid插入table_user表中。
我在php程序中会调用这个存储过程,取得这个新生成的uid值。
现在的问题是,我要在php文件中加锁,以保证多个用户同时调用这段操作时,不会发生错误。
请问,有没有什么好的方法??
我在php程序中会调用这个存储过程,取得这个新生成的uid值。
现在的问题是,我要在php文件中加锁,以保证多个用户同时调用这段操作时,不会发生错误。
请问,有没有什么好的方法??
1、是否可以都写在一个存储过程里吗?那样可以直接用事务。
2、是否可以设置table_user中的uid为主键,然后插入失败的话,重新调用存储过程生成新的uid。
3、将用户的操作做成队列的形式,一次调用一个。(可以单独一个表,将用户的请求放进去,然后有个程序循环去取这个表的第一条,呵呵)
简单说点想法哈。
begin tran
rollback(回滚)
commit(完成事务)还是不解的话,具体怎么做你去google或者baidu一下“Mysql 事务处理”
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