当前页面: 开发资料首页 → JSP 专题 → 注册时验证用户名是否存在的一点疑问
注册时验证用户名是否存在的一点疑问
摘要: 注册时验证用户名是否存在的一点疑问
注册的过程一般是先验证用户名(比如user1)是否存在,如果不存在然后在数据库中生成user1.
典型的代码如下:
...
Connection conn=XXX.getConnection();//通过某种方式建立连接
String sql="select userid from userinfo where userid="+userid;
ResultSet rs=statement.excuteQuery(sql)
if(rs.next())
return false;//用户名已经存在,返回false表明注册不成功;
else //用户名不存在以此用户名创建用户,疑问就在这里
{
sql="INSERT INTO userinfo (userid, password)"
+VALUES ("
+userid+",'"+password"')";
statement.excuteUpdate(sql);
}
conn.close()
......
这样验证用户名是否存在和创建用户之间必须是原子操作,
请问:
这里是如何实现这种原子性的?
我理解的是同一个时刻只能有一个线程能够和数据库建立连接(代码中体现的地方就是conn=XXX.getConnection(),同一时刻只能有一个线程能得到连接,如果几个线程一起抢,没抢到的就
先阻塞在这里)
这样理解不知道对不对?
getConnection()同步
数据库干的活, 它保证用户名唯一
与数据库交互的部分 同步
学习下...
是不是可以理解为只要在一个getConnection() 和conn.close()之间执行的数据库操作都是原子性的?
有些好像是填完用户名就可以验证的(这时保存了用户名吗?),再填其它信息,这之间隔了很长时间,在这时间里如果其它用户注册了这个名字,那不是用户已存在?
路过,友情up...
怎么没有高手来解答下阿?期待.....
我怎么看着你的SQL语句写的就有问题呢?
你直接把你检查用户名和添加用户这断代码用synchronize来同步就不行了吗
或者对你操作数据库的方法用synchronize
期待解决方法...
你直接把你检查用户名和添加用户这断代码用synchronize来同步就不行了吗
或者对你操作数据库的方法用synchronize
值得怀疑啊,对象层面(相对于类层面而言)的synchronize只是对多个线程访问同一个对象时起作用的(也就是说假如我的验证和创建两个方法都在db这个对象中,且都加了synchronized, 那么必须保证所有线程都通过db这个对象来进行数据库访问才能达到同步的效果),但是代码中这一点并没有体现,无法保证所有的线程只用这一个db对象来访问数据库
期待解决方法.......和楼主遇到同样问题!
没人知道么???
连接和声明要及时关闭,就不会出现占线的问题了,如果是并发访问,就是等待!
读阻塞就行了
在oracle中
select userid from userinfo where userid='XXX' for update
然后进行操作
注意事务提交的问题
楼上说的是oracle的锁,可能还有一些具体实现细节,比如for update后什么时候解锁等问题,先谢了.