SQL serverでレコードをinsertする際の主キーをどう設定するか
SQLserverでレコードをinsertしたいのですが、その際の主キーをどうやって設定するか悩んでいます。
今までmax(主キー)+1でやっていたのですが、この方法だと複数プロセス同時にinsertがかかったときに
同じ主キーを登録しようとしてしまうことがあります。
少し調べたのですが、TransactionScopeというのがありそれで排他処理できるようです。
しかし試してみたところ
「ハンドルされていない例外: System.Data.SqlClient.SqlException:
トランザクション (プロセス ID 65) が、ロック 個のリソースで他のプロセスとデッドロックして、
このトランザクションがそのデッドロックの対象となりました。トランザクションを再実行してください。」
という例外が起きてしまい上手くいきません。
以下試したコード(C#)です。同じプログラムをほぼ同時に起動したところ上記の例外が発生しました。
class Program
{
static void Main(string[] args)
{
DwhDBAccess.DwhTableAdapters.workSampleTableAdapter adapter = new DwhDBAccess.DwhTableAdapters.workSampleTableAdapter();
TransactionOptions o = new TransactionOptions { IsolationLevel = IsolationLevel.Serializable };
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew, o))
{
int max = 0;
try
{
max = adapter.GetData().Max(x => x.id);
}
catch (Exception e)
{
max = 0;
}
System.Threading.Thread.Sleep(10000);
adapter.InsertQuery(max + 1, "hello world.");
Console.WriteLine("Insert id=" + (max + 1).ToString());
ts.Complete();
}
}
}
排他制御を上手く働かせて同じidを登録しないようにするにはどうすればいいでしょうか。
よろしくお願いします。