我有一个用于医院/类似机构的显示令牌队列的应用程序。它向访客提供了部门的明智令牌数字。为此,我们有下表,其中最后一个发行的令牌no。
HospId Int Not Null
DeptId Int Not Null
TokenId Int Not Null /* current token number */
发出令牌时,我执行以下更新语句
Update <table> Set TokenId = (Select Max(TokenId) + 1 From <table>)
Where HospId = @HospId And DeptId = @DeptID
这很好,但是当有更多并发用户(超过200个用户(更新令牌时,它就会被挂起。是否有更好的方法来更新?
如果您不能使用自动增量数字,则可能在存储过程中使用代币生成代码,而在存储过程中使用SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
是可行的选项。
它会有所减慢,但应防止并发问题。
存储过程的原因是,通过将直接写入权禁用给您的应用程序用户,并仅通过EXECUTE AS OWNER
(MSDN(将其允许到存储过程中,您可以保证不会有有趣的事情和Rogue代码在您的令牌一代中戳孔。