一般的做注册模块时候,  玩家提交输入帐号信息, 假设玩家注册的账号是demok1,  我程序首先判断该帐号是否存在...这个地方可能判断合法性先不管 . 你是用AJAX , 或者查询缓存,或者数据库, 使用什么技术先不管..首先确定该帐号是否已被使用,如果没的话那么玩家注册成功后帐号就是该帐号demok1,  因此这里就是2个操作  一个select 一个insert但是这里有个问题, 如何保证有并发的情况 , 假设数据库里面没有demok1 这个帐号... 现在有2个玩家 或者3 - 5 个 更多玩家同时使用 demok1 这个帐号注册,同时提交会产生很多问题, 如果不在数据库的帐号字段做唯一约束, 那么数据库会出现多条  demok1 这样的帐号现在如何不在数据库做唯一约束的情况下, 保证即使在并发的情况下数据的准确性

解决方案 »

  1.   

    select * from account where name=”demok1” for update
      

  2.   


    1楼的方法并不能解决根本问题
    你虽然在行上加了更新锁了,实际上,你锁定了0行,两个用户同时插入的时候还是会存在同样的问题。
    所以这种时候只能够依赖于数据库的唯一约束,commit的时候将有一个会失败。
      

  3.   


    1楼的方法并不能解决根本问题
    你虽然在行上加了更新锁了,实际上,你锁定了0行,两个用户同时插入的时候还是会存在同样的问题。
    所以这种时候只能够依赖于数据库的唯一约束,commit的时候将有一个会失败。我本来的想法也是这样的,但是如果我查和插入如果是同一个事物可以不?
      

  4.   


    1楼的方法并不能解决根本问题
    你虽然在行上加了更新锁了,实际上,你锁定了0行,两个用户同时插入的时候还是会存在同样的问题。
    所以这种时候只能够依赖于数据库的唯一约束,commit的时候将有一个会失败。我本来的想法也是这样的,但是如果我查和插入如果是同一个事物可以不?查询和插入是同一个事务也是不行的,因为查询的时候记录是0条,就算你用更新锁,也只是锁定0条记录,所以也是不行。你如果实在没有办法在数据库上加约束的话,那就只能在应用里面增加同步了。但是这么做要三思,肯定对系统性能有严重影响。
      

  5.   


    1楼的方法并不能解决根本问题
    你虽然在行上加了更新锁了,实际上,你锁定了0行,两个用户同时插入的时候还是会存在同样的问题。
    所以这种时候只能够依赖于数据库的唯一约束,commit的时候将有一个会失败。我本来的想法也是这样的,但是如果我查和插入如果是同一个事物可以不?查询和插入是同一个事务也是不行的,因为查询的时候记录是0条,就算你用更新锁,也只是锁定0条记录,所以也是不行。你如果实在没有办法在数据库上加约束的话,那就只能在应用里面增加同步了。但是这么做要三思,肯定对系统性能有严重影响。看楼主的需求这样性能的确会出很多问题,但是我手动提交事务,select查出来的如果是0再insert进去在提交事务,应该是可以满足这个需求的吧?
      

  6.   


    1楼的方法并不能解决根本问题
    你虽然在行上加了更新锁了,实际上,你锁定了0行,两个用户同时插入的时候还是会存在同样的问题。
    所以这种时候只能够依赖于数据库的唯一约束,commit的时候将有一个会失败。我本来的想法也是这样的,但是如果我查和插入如果是同一个事物可以不?查询和插入是同一个事务也是不行的,因为查询的时候记录是0条,就算你用更新锁,也只是锁定0条记录,所以也是不行。你如果实在没有办法在数据库上加约束的话,那就只能在应用里面增加同步了。但是这么做要三思,肯定对系统性能有严重影响。看楼主的需求这样性能的确会出很多问题,但是我手动提交事务,select查出来的如果是0再insert进去在提交事务,应该是可以满足这个需求的吧?满足不了的。select * from account where name=”demok1” for update
    在事务1里面执行这条语句的时候,如果数据库没有记录,返回0条记录
    在事务1没有提交的情况下,事务2执行这条语句,你希望的结果是通过for update可以让这条语句挂起,等事务1commit了之后,事务2才获得锁,实际并不是,事务2执行查询的时候也是立即返回0条记录,不信你可以试试。
      

  7.   

    事物就一个,没记错悲观锁只有事物提交后别的操作才可以继续,我的理解就是select和insert在一个事物里应该就可以解决,公司的项目很少考虑这些,谢谢2L了
      

  8.   

    数据库的账户字段加约束确实能够避免上述问题, 但是在某些情况下,  数据库字段又不能加唯一约束比如某需求变了一下. 假设用户表有个类型type,  相同类型type的账户是不允许重复的,  不同类型type的账户可以重复....   这个需求,肯定不能在账户字段加唯一约束
      

  9.   

    AJAX验证用户名存在与否,只是为了更加好的用户体验,当你点击注册的时候还是要判断该用户名是否注册的,JS的验证只是为了更好的用户体验,并不是为了真正解决验证为题的