sql >> データベース >  >> RDS >> Mysql

MySQLの不可分操作とテーブルロック

    あなたはあなたのデザインに非常に近づいていますが、完全にはそこにありません。

    まず、イベントテーブルには、イベントでまだ利用可能なチケットの数を保持する必要があります(他に必要なものに加えて)。

    次に、エスクローテーブルには、エスクローの有効期限を示すDATETIME列が必要です。チケットがエスクローに入るたびにその値を設定する必要があります。

    第三に、チケットをエスクローに預ける取引は、

    する必要があります。
    1. イベント行をロックします。
    2. 利用可能なチケットの列をお読みください。 (十分でない場合は中止)
    3. エスクローテーブルに行を挿入します
    4. イベント行を更新して、使用可能なチケット列をデクリメントします。
    5. イベント行のロックを解除します。

    第4に、販売を完了するアクションでは、エスクロー行を削除し、販売済みチケット行を挿入する必要があります。これは難しいことではありません。

    第五に、エスクローのクリーンアップ操作が必要です。これは、有効期限が切れた(過去に有効期限がある)すべてのエスクロー行を検索する必要があり、それぞれについて:

    1. 対応するイベント行をロックします。
    2. エスクローテーブルからエスクローされたチケットの数を読み取ります
    3. エスクローテーブルの行を削除します。
    4. イベント行を更新して、使用可能なチケット列を増やします。
    5. イベント行のロックを解除します。

    秘訣は、利用可能なの数を確保することです。 チケットは正しく連動するように維持されているため、ユーザー間の競合状態がイベントを売り過ぎないようにします。




    1. MySQLの文字エンコードの変更。データの整合性は維持されていますか?

    2. Perl DBIは、mysqlネイティブの複数挿入機能を使用して複数の行を挿入します

    3. SQLiteにデータを挿入するときに、NULL値を列のデフォルト値に変換する

    4. SQLServer-UNPIVOTを使用してNULLを含める