在利用数据库事务处理会员注册时遇到一个问题。。
数据库是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个名称相同的会员数据。
总不能在注册的时候锁定会员表吧.
请问该如何解决这个问题呢,感谢各位事务数据库
数据库是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个名称相同的会员数据。
总不能在注册的时候锁定会员表吧.
请问该如何解决这个问题呢,感谢各位事务数据库
将任务外键ID和会员ID组成联合主键。
只是有的是用明锁(比如lock语句),有的是隐式锁(如唯一性约束,隔离事务等).
你现在的问题是要保证锁持续的时间足够短.
如果流程比较简单的, 就用唯一性约束
如果流程比较复杂的, 建议将整个流程写在一个存储过程中,以提高效率.