フォーラムテーブルと多くのユーザーが同時にメッセージを挿入することを考えると、このトランザクションはどの程度安全ですか?
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
DECLARE @LastMessageId SMALLINT
SELECT @LastMessageId = MAX(MessageId)
FROM Discussions
WHERE ForumId = @ForumId AND DiscussionId = @DiscussionId
INSERT INTO Discussions
(ForumId, DiscussionId, MessageId, ParentId, MessageSubject, MessageBody)
VALUES
(@ForumId, @DiscussionId, @LastMessageId + 1, @ParentId, @MessageSubject, @MessageBody)
IF @@ERROR = 0
BEGIN
COMMIT TRANSACTION
RETURN 0
END
ROLLBACK TRANSACTION
RETURN 1
ここで、最後のMessageIdを読み取り、それをインクリメントします。グループに挿入されたメッセージごとにインクリメントする必要があるため、IDフィールドを使用できません(テーブルに挿入されたすべてのメッセージではありません)。