はのは、SQL Server 2012の中に以下のような簡単な表を想定してみましょう:C#でselect文で自動インクリメントされた主キーの最後の値を取得するのは安全ですか?
CREATE TABLE Person (
Id INT IDENTITY(1, 1) PRIMARY KEY,
Name NVARCHAR(50)
)
そして、次のように対応するクラス:
public class Person
{
public int Id {get; set;}
public string Name {get; set;}
}
は、以下のCreatePerson
方法(擬似コード)今考えてみましょう:
public static Person CreatePerson(string name) {
...
DB.Execute("INSERT INTO Person(Name) VALUES (name)", name);
int lastId = DB.Get("SELECT MAX(Id) FROM Person");
return new Person {Id = lastId, Name=name};
}
このメソッドは、dbに新しい人物行を作成し、新しいPersonオブジェクトを作成してから、作成されたsuデータベースが生成したIDを格納するように指定されています。
は、次のSELECT文を使用して最後に生成されたIdを取得するのが安全かどうか(並行処理の観点から)ですか?
SELECT MAX(Id) FROM Person
私は次のシナリオを懸念しています:
- USER Aが
person 2
- USERが最後の読み込み挿入
person 1
- ユーザーBを挿入しますイドはイドだと思うユーザAとユーザBは、ここでデータベースへの2つの別々のクエリを処理するスレッドを指す。なお
。
を使用してlastIdを得ることができますか?分散システムでは、そのような情報は簡単に時代遅れになる可能性があります。 – xxbbcc
ユーザーAに挿入された人物(またはこの場合は人物)を見たい場合は、その人物を挿入したユーザーを示すフィールドをテーブルに追加することができます。あなたの 'SELECT'に合った' WHERE'文を追加すると、 'MAX(Id)'に問題はないはずです。 –
[挿入された行のIDを取得するための最良の方法?](http://stackoverflow.com/questions/42648/best-way-to-get-identity-of-insertedrow) – Igor