create procedure insertUser
@userName nvarchar(20)
as
insert into user(name) select @userName from user where
not exists(select count(*) from user where name=@userName)
请问大虾们以上写的存储过程是否可以避免用户注册相同的用户名呢?
希望高手们给我指点迷津 万分感谢!!!!!
数据库事务加锁表应该是可以的,不过这样的话,吞吐量就成问题了。同一个时间点两个同样的名字的几率还是和苹果砸到的几率差不多的,除非的特殊应用。
感谢你的回复 恩 虽然概率小点 但是从程序的健壮性看 我还是希望写的能够严谨写O(∩_∩)O~
存储过程没有试过,但是在代码中实现这样的功能是很简单的....
其基本原理是:当用户要插入某个userName的时候,系统要判断,该userName是否已经存在,如果存在,则不让其插入,如果不存在,则允许插入....逻辑很简单。。。所以在代码中实现不是很复杂....
希望大家一起交流:hongtenzone@foxmail.com
谢谢你的回复 但是如果考虑高并发用户注册的情况下 你说的这个处理方法可能就存在问题了 很可能不能保证用户名不重复 不知道我说的 对不对?请多多指教 O(∩_∩)O~
@youhumian: 你说的很有道理,当并发的时候,解决这个问题用存储过程是一种方法....支持下
我对存储过程不是很懂,我看了一下:http://www.cnblogs.com/kkcheng/archive/2010/03/19/1689672.html这个的例子
和http://database.51cto.com/art/201010/229242.htm的例子,有写明白了,或许对你
有帮助...
还是表示感谢 我从网上查了相关的资料 一般解决这种高并发环境下用户注册名不重复的问题 有以下几种方法:(1)在程序中使用锁来控制的;(2)在数据库中用事务和锁协同控制 (3)数据库中设置事务较高的隔离级别 以上三种各有利弊 咱们可以一块探讨一下这个问题
建议这样写:
IF(NOT EXISTS(SELECT 1 FROM user WHERE name=@userName) BEGIN INSERT INTO user(name)VALUES(@userName) END
再加一个又双保险,给name字段加上唯一性约束。
感谢专家的回复 你写的给name字段加唯一性约束,确实能够保证用户名的唯一性 ; 其实我想知道的是 如果按我写的话,如下
insert into user(name) select @userName from user where
not exists(select count(*) from user where name=@userName)
这一sql语句,数据库引擎是否会保证它是在cpu一个时间片上执行的,即一次执行完这个语句
请专家给我指点 谢谢 O(∩_∩)O~
@youhumian: 对数据库引擎的原理,我不太了解。在实际应用中,我们使用这样的代码并没遇到插入重复数据的情况。
恩 在实际应用中 一般像这样处理 就可以防止用户名重名了 我只不过想更精确的控制在并发情况下可能出现的重名 O(∩_∩)O~
说得实际一点,一般用户名写了之后,用ajax技术先去扫一个表,看有没有被占用。如果没占用的话,先放到服务器缓存区里,这时这个名字就不允许别人用了。所以我感觉你不应该在插入时处理这种事,而是应该提前处理。
感谢你的回复 你说的提前处理 这个想法挺好的
@youhumian: 想法好
牛逼
这是我见到最好的一个回答