【发布时间】:2010-12-04 08:04:04
【问题描述】:
考虑到一个论坛表和许多用户同时向其中插入消息,此事务的安全性如何?
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 并将其递增。我不能使用标识字段,因为它需要为插入组中的每条消息增加(不是每条消息都插入表中。)
【问题讨论】:
-
为什么每次讨论都需要重启MessageId?只需使用全局 MessageId 而不是复合键即可。这将为您节省很多麻烦并简化操作,例如将消息从一个讨论转移到另一个讨论。
-
是的。你是对的。一个作为 Identity 的全局 MessageId 更容易解决这个问题。我不记得我为什么要这样设计!还是谢谢。
标签: sql sql-server concurrency transaction-isolation