大牛们:关于mysql数据事务处理,感谢帮忙

fandoc3 2013-05-30 08:25:19
在利用数据库事务处理会员注册时遇到一个问题。。
数据库是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个名称相同的会员数据。
总不能在注册的时候锁定会员表吧.
请问该如何解决这个问题呢,感谢各位

...全文
85 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
trainee 2013-05-31
  • 打赏
  • 举报
回复
引用 4 楼 fandoc3 的回复:
引用 2 楼 WWWWA 的回复:
插入时锁表,插入,没有错误提交,UNLOCK表
这个问题我也想过,但是会出现一个问题 也就是在同一时刻会有N个人注册,举个例子现在有100个人在提交,如果锁表的方式,那么其他99个必然会出现要么排队,要么拒绝执行这个问题。
你的问题无论采取什么解决方案, 都会涉及到锁表. 只是有的是用明锁(比如lock语句),有的是隐式锁(如唯一性约束,隔离事务等). 你现在的问题是要保证锁持续的时间足够短. 如果流程比较简单的, 就用唯一性约束 如果流程比较复杂的, 建议将整个流程写在一个存储过程中,以提高效率.
steely_chen 2013-05-31
  • 打赏
  • 举报
回复
引用 4 楼 fandoc3 的回复:
引用 2 楼 WWWWA 的回复:
插入时锁表,插入,没有错误提交,UNLOCK表
这个问题我也想过,但是会出现一个问题 也就是在同一时刻会有N个人注册,举个例子现在有100个人在提交,如果锁表的方式,那么其他99个必然会出现要么排队,要么拒绝执行这个问题。
觉得楼主问的属于学习型问题,当你到了实际应用中自然就会知道,插入重要信息的时候不会让处理达到2秒以上。也不用去想像排队,锁表的问题。
steely_chen 2013-05-31
  • 打赏
  • 举报
回复
引用 3 楼 fandoc3 的回复:
引用 1 楼 rucypli 的回复:
用户名设置成唯一 B用户注册必然返回错误
您好,您提到的设置为唯一字段,我联想到一个问题:比如有一个任务招标系统,分为2个表,任务表和稿件表,会员可以参与任何一个任务,投标之后将会在稿件表生成一条记录(表结构:任务外键ID,会员ID,参与时间),如果投递过 这个任务的就禁止再次投递,如果没参与过就INSERT。 如果也是在插入稿件表的时候需要1分钟时间,而在事务处理的这段时间也被提交了2次,怎么来解决这个问题呢
将任务外键ID和会员ID组成联合主键。
fandoc3 2013-05-31
  • 打赏
  • 举报
回复
引用 2 楼 WWWWA 的回复:
插入时锁表,插入,没有错误提交,UNLOCK表
这个问题我也想过,但是会出现一个问题 也就是在同一时刻会有N个人注册,举个例子现在有100个人在提交,如果锁表的方式,那么其他99个必然会出现要么排队,要么拒绝执行这个问题。
fandoc3 2013-05-31
  • 打赏
  • 举报
回复
引用 1 楼 rucypli 的回复:
用户名设置成唯一 B用户注册必然返回错误
您好,您提到的设置为唯一字段,我联想到一个问题:比如有一个任务招标系统,分为2个表,任务表和稿件表,会员可以参与任何一个任务,投标之后将会在稿件表生成一条记录(表结构:任务外键ID,会员ID,参与时间),如果投递过 这个任务的就禁止再次投递,如果没参与过就INSERT。 如果也是在插入稿件表的时候需要1分钟时间,而在事务处理的这段时间也被提交了2次,怎么来解决这个问题呢
WWWWA 2013-05-31
  • 打赏
  • 举报
回复
插入时锁表,插入,没有错误提交,UNLOCK表
rucypli 2013-05-30
  • 打赏
  • 举报
回复
用户名设置成唯一 B用户注册必然返回错误

56,687

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧