私は一見したところで、非常に単純な問題を抱えています。私はプレフィックスを持つ一意のキー値を取得できるようにしたい。私は 'Prefix'と 'Next_Value'列を含むテーブルを持っています。SQL Server 2005でトランザクションの整合性を保証する方法
あなたはトランザクションを開始し、このテーブルから次の値を取得し、テーブルの次の値をインクリメントしてコミットし、プレフィックスを値に連結して、一連の一意の英数字キー。
しかし、負荷がかかり、さまざまなサーバーがADO.NET経由でこのストアドプロシージャに当たって、私は時々、同じキーを別のクライアントに返すことを発見しました。これは、キーがプライマリキーとして使用されたときに、その後エラーが発生します。
BEGIN TRAN ... COMMIT TRANは、スコープ内のデータアクセスのアトミック性を保証していました。これを調べると、トランザクション分離レベルについて発見され、SERIALIZABLEが最も制限的なものとして追加されました。ここで
Create proc [dbo].[sp_get_key]
@prefix nvarchar(3)
as
set tran isolation level SERIALIZABLE
declare @result nvarchar(32)
BEGIN TRY
begin tran
if (select count(*) from key_generation_table where prefix = @prefix) = 0 begin
insert into key_generation_table (prefix, next_value) values (@prefix,1)
end
declare @next_value int
select @next_value = next_value
from key_generation_table
where prefix = @prefix
update key_generation_table
set next_value = next_value + 1
where prefix = @prefix
declare @string_next_value nvarchar(32)
select @string_next_value = convert(nvarchar(32),@next_value)
commit tran
select @result = @prefix + substring('000000000000000000000000000000',1,10-len(@string_next_value)) + @string_next_value
select @result
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK TRAN
DECLARE @ErrorMessage NVARCHAR(400);
DECLARE @ErrorNumber INT;
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
DECLARE @ErrorLine INT;
SELECT @ErrorMessage = N'{' + convert(nvarchar(32),ERROR_NUMBER()) + N'} ' + N'%d, Line %d, Text: ' + ERROR_MESSAGE();
SELECT @ErrorNumber = ERROR_NUMBER();
SELECT @ErrorSeverity = ERROR_SEVERITY();
SELECT @ErrorState = ERROR_STATE();
SELECT @ErrorLine = ERROR_LINE();
RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState, @ErrorNumber,@ErrorLine)
END CATCH
が鍵生成テーブルです...ボックスの外側を考える
CREATE TABLE [dbo].[Key_Generation_Table](
[prefix] [nvarchar](3) NOT NULL,
[next_value] [int] NULL,
CONSTRAINT [PK__Key_Generation_T__236943A5] PRIMARY KEY CLUSTERED
(
[prefix] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
どの部分が重複していますか?接頭辞または数字部分? – gbn