私の問題は、トランザクションの前半で実行された、選択に依存する計算値を持つ新しい行を挿入したいということです。ただし、並列トランザクションが同じ計算値を挿入することは避けてください。
この問題は、トランザクション分離レベルSERIALIZABLEによって回避する必要があります。しかし、そうではありません。
次の手順を実行します。
- トランザクションA:開始;
- トランザクションB:開始;
- トランザクションA:tableNameからmax(x)を選択します。
- トランザクションB:tableNameからmax(x)を選択します。
- トランザクションB:tableName(x、PK_COLUMN)の値(max + 1、primaryKeyA)に挿入します。
- トランザクションA:tableName(x、PK_COLUMN)の値(max + 1、primaryKeyB)に挿入します。
- トランザクションA:コミット;
- トランザクションB:コミット;
この後、MySQLには、同じx値を持つ2つの新しい行がありますが、両方のトランザクションの1つが中止されるようにします。
PostgreSQLでは、これを実行できますLOCK TABLE tableName IN SHARE MODE
。これにより、トランザクションAで手順6を実行できなくなります。MySQLでは、http: //dev.mysql.com/doc/refman/5.1/de/lock-tables.htmlで説明されているLOCKING手法を試しましたが成功しませんでした。 。
助言がありますか?ありがとう。