一般的做注册模块时候, 玩家提交输入帐号信息, 假设玩家注册的账号是demok1, 我程序首先判断该帐号是否存在...这个地方可能判断合法性先不管 . 你是用AJAX , 或者查询缓存,或者数据库, 使用什么技术先不管..首先确定该帐号是否已被使用,如果没的话那么玩家注册成功后帐号就是该帐号demok1, 因此这里就是2个操作 一个select 一个insert但是这里有个问题, 如何保证有并发的情况 , 假设数据库里面没有demok1 这个帐号... 现在有2个玩家 或者3 - 5 个 更多玩家同时使用 demok1 这个帐号注册,同时提交会产生很多问题, 如果不在数据库的帐号字段做唯一约束, 那么数据库会出现多条 demok1 这样的帐号现在如何不在数据库做唯一约束的情况下, 保证即使在并发的情况下数据的准确性
1楼的方法并不能解决根本问题
你虽然在行上加了更新锁了,实际上,你锁定了0行,两个用户同时插入的时候还是会存在同样的问题。
所以这种时候只能够依赖于数据库的唯一约束,commit的时候将有一个会失败。
1楼的方法并不能解决根本问题
你虽然在行上加了更新锁了,实际上,你锁定了0行,两个用户同时插入的时候还是会存在同样的问题。
所以这种时候只能够依赖于数据库的唯一约束,commit的时候将有一个会失败。我本来的想法也是这样的,但是如果我查和插入如果是同一个事物可以不?
1楼的方法并不能解决根本问题
你虽然在行上加了更新锁了,实际上,你锁定了0行,两个用户同时插入的时候还是会存在同样的问题。
所以这种时候只能够依赖于数据库的唯一约束,commit的时候将有一个会失败。我本来的想法也是这样的,但是如果我查和插入如果是同一个事物可以不?查询和插入是同一个事务也是不行的,因为查询的时候记录是0条,就算你用更新锁,也只是锁定0条记录,所以也是不行。你如果实在没有办法在数据库上加约束的话,那就只能在应用里面增加同步了。但是这么做要三思,肯定对系统性能有严重影响。
1楼的方法并不能解决根本问题
你虽然在行上加了更新锁了,实际上,你锁定了0行,两个用户同时插入的时候还是会存在同样的问题。
所以这种时候只能够依赖于数据库的唯一约束,commit的时候将有一个会失败。我本来的想法也是这样的,但是如果我查和插入如果是同一个事物可以不?查询和插入是同一个事务也是不行的,因为查询的时候记录是0条,就算你用更新锁,也只是锁定0条记录,所以也是不行。你如果实在没有办法在数据库上加约束的话,那就只能在应用里面增加同步了。但是这么做要三思,肯定对系统性能有严重影响。看楼主的需求这样性能的确会出很多问题,但是我手动提交事务,select查出来的如果是0再insert进去在提交事务,应该是可以满足这个需求的吧?
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条记录,不信你可以试试。