站内搜索: 请输入搜索关键词

当前页面: 开发资料首页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后什么时候解锁等问题,先谢了.


↑返回目录
前一篇: 通过Javabean,取数据库一条记录的一个属性
后一篇: JSP网站如何保证多用户访问时不出错?