ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

php-如何在MySQL中实现交易安全的随机序列

2019-12-01 11:16:44  阅读:173  来源: 互联网

标签:transactions sequence innodb mysql php


因此,我的应用程序需要让用户生成随机的字母数字代码,例如A6BU31、38QV3B,R6RK7T.目前,它们由6个字符组成,而未使用I和O(因此我们有34 ^ 6的可能性).然后将这些代码打印出来并用于其他用途.

现在,我必须确保许多用户可以“保留”每个请求最多100个代码,因此用户A可能想要获得50个代码,用户B要生成10个代码,依此类推.这些代码在所有用户之间必须是唯一的,因此用户A和用户B可能不会都收到代码ABC123.

我当前的方法(使用PHP和MySQL)是为此使用两个InnoDB表:

>一个(“存储库”)包含大量预生成的代码(因为冲突的可能性会随着时间的推移而增加,并且我不想尝试使用try-insert-if-fails-try-other-code方法) .该存储库仅包含代码和自动递增的ID(因此我可以对其进行排序,请参见下文).
>另一个表保留保留键(即拥有代码的用户).

每当用户想要保留N个键时,我计划执行以下操作

BEGIN;
INSERT INTO revered_codes (code,user_id)
  SELECT code FROM repository WHERE 1 ORDER BY id LIMIT N;
DELETE FROM repository WHERE 1 ORDER BY id LIMIT N;
COMMIT;

这应该可以,但是我不确定.似乎我正在构建WTF解决方案.

插入后,我必须选择刚刚保留的代码以将其显示给用户.这是棘手的部分,因为在交易完成后,我真的不知道如何识别刚刚保留的代码.我当然可以在我的reserved_codes表中添加另一列,其中包含某种随机令牌,但这似乎更加WTFy.

我最喜欢的解决方案是使用随机数序列,这样我就可以在reserved_codes表中执行INSERT操作.

那么,如何在MySQL中执行此唯一,随机和事务安全的序列?一种想法是在reserve_codes表上进行常规的自动递增,并从该数字列中导出随机代码值,但是我想知道是否有更好的方法.

更新:我忘了说,保留一个很小的保留代码表会很有利,因为我后来不得不再次查找单个代码来更新它们(reserved_codes具有两个其他属性).因此,让保留表缓慢增长是好的(而不是在〜1mio的预生成代码上拥有巨大的索引).

解决方法:

如果您已经有一个存储库表,则只需添加一个用户列,然后运行此查询:

UPDATE repository SET user_id = ? WHERE user_id IS NULL LIMIT N;

之后,您可以再次选择记录.这有两个明显的缺点:

>您需要在user_id上建立索引
>除了将其绑定到用户之外,您不能将表中的代码用于其他任何用途.

标签:transactions,sequence,innodb,mysql,php
来源: https://codeday.me/bug/20191201/2080424.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有