2

このコードは、SQL Server 2008 のストアド プロシージャでした。

select @pkvalue = maxkey + 1, @id = id
from dbo.sys_maxkey
where tablename = UPPER(@tablename) and keyname = UPPER(@fieldname) and ds_id = @ds_id   

update dbo.sys_maxkey with (updlock)
set maxkey = maxkey + 1
where id = @id  

このコードは主キーを取得し、すべてのテーブルの最大主キーが格納されているテーブルから最大キーを見つけますが、問題があります。同時実行性が高い場合、おそらく 2 人以上の人が同時に行を読み取る可能性があります ( uplock を追加)、同じ値を更新してデータを挿入すると、エラーが発生します。回避するにはどうすればよいですか?

4

1 に答える 1

1

で排他ロックを使用して値を読み取ることができますselect

select @pkvalue=maxkey+1,@id=i
from dbo.sys_maxkey with (xlock)
where tablename=UPPER(@tablename) and keyname=UPPER(@fieldname) and ds_id=@ds_id 

両方のステートメント (読み取りと更新) を 1 つのトランザクションに入れる必要があります。

これにより、最初のプロセスがトランザクションで完了するまで、2 番目のプロセスが値を読み取ることさえブロックされます。

于 2013-10-28T01:31:35.027 に答える