在利用数据库事务处理会员注册时遇到一个问题。。
数据库是MYSQL;事务隔离级别是:REPEATABLE READ 假设注册账号为“tmp”
php代码:页面代码:
$isreg=$user->get_isreg();  //get_isreg()函数主要查询user表,判断有没有name='tmp',如果有则返回false,没有返回true;
if($isreg)return $user->set_reg();===========================================================
调用的方法:
function set_reg()
{
    mysql_query("BEGIN");//开启事务    插入会员表();     if(插入是否成功)    {
        mysql_query("COMMIT");
        return true;
    }
    else
    {   
        mysql_query("ROLLBACK");
        return false;
    }
}
=====================================
好了问题出来了,假设“插入会员表(); ”这个函数需要执行1分钟才结束(注意:假设)
A用户申请注册TMP,在8:01分01秒的时候提交了,这时候数据库查询没有,则利用事务执行注册程序。
B用户也同时申请注册TMP,在8:01分02秒的时候,这时候也去查询了,也没查到(虽然执行了A的注册,但函数需要1分钟时间 所以还没执行完呢),这时候程序就自然而然进行B的注册。//插入会员表(); 这个函数主要是插入各种表的操作,比如基本信息表,积分表,空间表,好友表,等等等等
结果出来了 就是注册了2个名称相同的会员数据。
总不能在注册的时候锁定会员表吧.
请问该如何解决这个问题呢,感谢各位事务数据库

解决方案 »

  1.   

    插入时锁表,插入,没有错误提交,UNLOCK表
      

  2.   

    您好,您提到的设置为唯一字段,我联想到一个问题:比如有一个任务招标系统,分为2个表,任务表和稿件表,会员可以参与任何一个任务,投标之后将会在稿件表生成一条记录(表结构:任务外键ID,会员ID,参与时间),如果投递过 这个任务的就禁止再次投递,如果没参与过就INSERT。 如果也是在插入稿件表的时候需要1分钟时间,而在事务处理的这段时间也被提交了2次,怎么来解决这个问题呢
      

  3.   


    将任务外键ID和会员ID组成联合主键。
      

  4.   

    你的问题无论采取什么解决方案, 都会涉及到锁表.
    只是有的是用明锁(比如lock语句),有的是隐式锁(如唯一性约束,隔离事务等).
    你现在的问题是要保证锁持续的时间足够短.
    如果流程比较简单的, 就用唯一性约束
    如果流程比较复杂的, 建议将整个流程写在一个存储过程中,以提高效率.