1

2012-01 (2012 年は現在の年) という形式の数値があり、01 はデータベース内のフィールドの最大値を 1 ずつ増やしたものであり、その数値は毎年 0 にリセットされます。

ただし、同じ操作を同時に実行しようとする 2 人のユーザーがいる場合、両方の値が同じであるため、データベースに同じ番号が 2 回挿入されます。

シーケンスを作成することを考えましたが、それには毎年シーケンスをリセットする作業が必要であり、次の番号を取得する前にロックを作成し、挿入が完了した後に解放する方法があればいいと思いますか?

ありがとう。

4

2 に答える 2

5

CREATE UNIQUE INDEX index_name ON table_name(column_name);

また

ALTER TABLE table_name ADDCONSTRAINT制約名UNIQUE(column_name);

于 2012-04-05T17:09:47.830 に答える
2

カウンターとして使用されるフィールドをどこに保存するかは指定しません。しかし、SELECT FOR UPDATEステートメントを使用することは可能かもしれません。

カウンターフィールドの値を1増やす前に、を使用してそのレコードをロックできますSELECT FOR UPDATE。次に、カウンターを更新します。

テーブルにレコードが1つしかない場合、次のようになります。

SELECT *  
FROM   CounterTable
FOR UPDATE;

UPDATE CounterTable
SET    Counter = Counter + 1;

COMMIT;

一方のセッション(ユーザー)が実行し、SELECT FOR UPDATEまだコミットまたはロールバックされていない場合、もう一方のセッション(ユーザー)SELECT FOR UPDATEは、ロックを取得できるようになるのを待ってブロックします。これにより、2人のユーザーが同じ番号を取得するのを防ぎます。

于 2012-04-05T19:30:05.447 に答える