怎样避免用户并发操作时获取同一条数据库记录?

PHP编程者 2011-12-19 05:15:08
如题,查询一条is_used=0的记录,取这条记录中code字段的值给用户,再设此记录的is_used=1,怎样防止并发?(避免同一个记录的code值被多个用户获得),好像用mysql的行锁定能解决,但不知道怎么进行行锁定,从网上也没有查到可行的代码,请大家帮忙指点下,代码如下:

$sql = "SELECT * FROM code WHERE is_used=0 ORDER BY Id LIMIT 1";

$code_row = $GLOBALS['db']->getRow($sql);

if($code_row)
{
$sql = "UPDATE code SET is_used=1 WHERE Id='".$code_row['Id']."'";
$GLOBALS['db']->query($sql);

}
...全文
817 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2011-12-21
  • 打赏
  • 举报
回复
我说错了没关系,因为我会改正
我不知道也没关系,因为我会去学习

http://hchmsguo.iteye.com/blog/454214
PHP编程者 2011-12-21
  • 打赏
  • 举报
回复
我的表是InnoDB的,怎么实现行级锁呢?
码无边 2011-12-21
  • 打赏
  • 举报
回复
如果用mysql控制不可取,还是在code控制吧。
icelemon1314 2011-12-20
  • 打赏
  • 举报
回复
表引擎用的MyISAM:那么只支持表级锁;InnoDB引擎可以支持行级锁。
像楼主那种情况,数据库会自动处理。当写数据时候,数据库会自动加上写锁,直到写锁撤销后,才可以读数据。
helloyou0 2011-12-20
  • 打赏
  • 举报
回复
这个for update具体如何用在这里我还没想明白,

对我来说,用事务是最清楚简单的,



[Quote=引用 4 楼 maquan 的回复:]

SQL code
SELECT * FROM code WHERE is_used=0 ORDER BY Id LIMIT 1 FOR UPDATE

————————————————————————————————
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
[/Quote]
zhouzhipen 2011-12-20
  • 打赏
  • 举报
回复
用户不可能同时操作同一条记录的,用户再怎么并发,数据库会帮你排队处理的。如果还需要自己来处理这种问题,需要数据库做什么?
ZT_King 2011-12-20
  • 打赏
  • 举报
回复
innodb提供行级锁,老大可能接触多的是老版本的MySQL.
maquan 2011-12-20
  • 打赏
  • 举报
回复
老大,你这两句好像都错了耶 :D
[Quote=引用 1 楼 xuzuning 的回复:]
数据库资源是共享,不可能限制读取,加锁只是防止重复写
另外 mysql 只提供表级加锁
[/Quote]


————————————————————————————————
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
maquan 2011-12-20
  • 打赏
  • 举报
回复
SELECT * FROM code WHERE is_used=0 ORDER BY Id LIMIT 1 FOR UPDATE



————————————————————————————————
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
PHP编程者 2011-12-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xuzuning 的回复:]

数据库资源是共享,不可能限制读取,加锁只是防止重复写
另外 mysql 只提供表级加锁
[/Quote]有什么好的方法避免这种情况的发生呢?
小在在 2011-12-20
  • 打赏
  • 举报
回复
mysql有自己的机制,你只用考虑数据大小,读取快慢
xuzuning 2011-12-19
  • 打赏
  • 举报
回复
数据库资源是共享,不可能限制读取,加锁只是防止重复写
另外 mysql 只提供表级加锁

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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