検索

ホームページ  >  に質問  >  本文

php - 数据库与逻辑应用分离的情况下怎么保证信息同步,或者叫安全

我不太明白这个词怎么表达

是这样的,现在有一台服务器运行数据库(server),另外一台运行php程序(client),浏览器(Browser)访问client,然后client逻辑判断后通过http协议对server中的数据库进行CURD操作

有个问题就是,如果Browser的用户操作过快,而serverclient之间http请求太慢的话,就会导致client上获取的数据更新不及时,导致一些错误。。

栗子:一个用户只能买一个商品,用户点击之后,client先读取server的数据,判断是否已经购买,没有购买的话进行写入操作,然后购买完成,但是如果用户连着点击两次购买,两次操作一次进入client,然后由于clientserver之间网速或者其他一些问题,写入操作没有及时完成造成两次购买操作的判断为此用户未购买,于是会有两次写入server数据库的操作,就会造成错误。。

这个问题属于什么?应该怎么解决?

迷茫迷茫2782日前960

全員に返信(6)返信します

  • 怪我咯

    怪我咯2017-04-17 16:50:34

    インメモリ データベースまたは NOSQL データベースを使用してクライアントと対話すると、インメモリ データベースが MYSQL などのリレーショナル データベースと「同期」されます。

    クライアント上の特定の操作を決定するためにデータベース クエリが必要な場合、同時実行性が高いとエラーが発生しやすくなります。たとえば、ユーザー登録で重複する名前が存在するかどうかを判断する場合、理論的には、まずデータベースにクエリを実行してユーザー名が存在するかどうかを確認してから挿入します。しかし、実際の運用では、このロジックが使用されます。が壊れ、同名のユーザーが発見されました。

    したがって、コア データをリレーショナル データベースに置き、速度が必要な場合はインメモリ データベースを使用します。キャッシュを適切に使用して、重複するクエリを減らします。

    返事
    0
  • ringa_lee

    ringa_lee2017-04-17 16:50:34

    一般的な解決策は、サーバーが最初にトークンを提供することです。トークンが使い果たされた場合にのみ、トークンは期限切れとしてマークされます。これにより、動作が繰り返されないようにできるだけでなく、電流制限などの機能も実行できます。

    あなたの質問には何か問題があります。データベースと業務サーバー間の通信のセキュリティを確保する場合は、SSL プロトコルを使用できます。

    もう 1 つのアプローチは、一貫性のあるハッシュを使用して、ID をインクリメントせずにビジネス ID を計算することです。これにより、多くの操作が冪等であることが保証されます。興味がある場合は、試してみてください。

    返事
    0
  • 天蓬老师

    天蓬老师2017-04-17 16:50:34

    ご招待ありがとうございます。決定は Lizi クライアントが行ってください

    返事
    0
  • ringa_lee

    ringa_lee2017-04-17 16:50:34

    トークンを割り当てることは、もちろん非常に良い解決策です。ただし、実際のアプリケーションでは、次の解決策の方がより簡潔で効率的だと思います:

    1. フロントエンド js で処理します。 [購入] ボタンをクリックすると、ユーザーが 2 回目をクリックするのを防ぐために全画面マスクが表示されます。バックグラウンドが成功すると、マスクが表示されます。削除される。さらに、フラグ ビットを使用したり、従来のデバウンス/スロットル アルゴリズムを使用したりすることもできます。

    2. また、購入プロセス中に、短期間 (10 秒以内など) に繰り返し購入が行われた場合、「操作を繰り返さないでください」というエラーが直接返されることも背景により決定されます。データベース側では、トランザクションを使用してトランザクションの分離レベルを上げるか、ロックの使用を検討できます。

    一般に、フロントエンド js で処理した後は、多くの問題を回避できます。悪意のあるユーザーがいない限り。

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 16:50:34

    同時ロックを追加するには、redis、memcached などを使用し、リクエストが完了した後にロックを解放できます

    リーリー

    返事
    0
  • 黄舟

    黄舟2017-04-17 16:50:34

    上記から、2 つのサーバーがあり、1 つは php を実行し、もう 1 つは db を実行していることがわかります。しかし、2 つのサーバー間の通信に http プロトコルを使用する必要があるのはなぜでしょうか? mysql のデフォルトの接続プロトコルを使用する代わりに (mysql を使用していると仮定して)?つまり、phpでサーバーのデータベースに直接接続し、DBを操作する必要があります。

    例で述べた連続挿入の問題については、テーブル構造の設計によって解決でき、一意のインデックス UNIQUE をフィールドに追加できます。他にもいくつか方法がありますが、個人的には独自のインデックス方式をおすすめします

    返事
    0
  • キャンセル返事