@南湖船老大 你好,想跟你请教个问题:现在需要做抢激活码的功能,激活码是随机的,怎么才能确保不会出现多个用户查询到同一个激活码呢?行锁可以吗?我试过行锁,如果锁到一条记录,另外session再去查询这条记录就会等待锁,能不用等待锁,再去查询其他记录吗?
@南湖船老大 你好,想跟你请教个问题:现在需要做抢激活码的功能,激活码是随机的,怎么才能确保不会出现多个用户查询到同一个激活码呢?行锁可以吗?我试过行锁,如果锁到一条记录,另外session再去查询这条记录就会等待锁,能不用等待锁,再去查询其他记录吗?
看看mysql 牛们怎么说
引用来自“宏哥”的评论
看看mysql 牛们怎么说
坐等
这个激活码是预先生成好的吗?如过是,这个可以用乐观锁所吧,
随机查询激活码
其他操作等等
更新激活码版本,更新条数==1 成功,否则回滚事务,重试。
解决方案太多。 在此不一一列举哦。 利用数据库的唯一所以可保证唯一。用更新状态可保证激活码生成成功。 用预生成的状态外加激活使用也是一种。
引用来自“lock_free”的评论
这个激活码是预先生成好的吗?如过是,这个可以用乐观锁所吧,
随机查询激活码
其他操作等等
更新激活码版本,更新条数==1 成功,否则回滚事务,重试。
用的是PHP,要是JAVA就好搞了
引用来自“泡不烂的凉粉”的评论
解决方案太多。 在此不一一列举哦。 利用数据库的唯一所以可保证唯一。用更新状态可保证激活码生成成功。 用预生成的状态外加激活使用也是一种。
恩,我的问题关键是怎么避免有脏数据产生
注意事务的隔离性,不要脏数据,第二个级别的隔离性就可以保证了,MySQL 数据库的默认事务隔离级别就是 READ_COMMITTED,已经是能满足无脏读了。
不想要等待,那就是楼上说的预生成了吧
队列啊...
引用来自“南湖船老大”的评论
注意事务的隔离性,不要脏数据,第二个级别的隔离性就可以保证了,MySQL 数据库的默认事务隔离级别就是 READ_COMMITTED,已经是能满足无脏读了。
不想要等待,那就是楼上说的预生成了吧
感谢
引用来自“泡不烂的凉粉”的评论
解决方案太多。 在此不一一列举哦。 利用数据库的唯一所以可保证唯一。用更新状态可保证激活码生成成功。 用预生成的状态外加激活使用也是一种。
感谢