【发布时间】:2011-03-19 09:03:29
【问题描述】:
我有一个网页 Default.aspx,它为每个新用户生成 id,然后点击 Default.aspx 按钮将 id 提交到数据库...
如果其他用户也在同一时间输入,则 id 将是相同的......直到他们按下 default.aspx 上的按钮
如何摆脱这个问题...这样...每个用户都将被分配唯一的 id ...
我使用读写代码生成唯一id ..
【问题讨论】:
我有一个网页 Default.aspx,它为每个新用户生成 id,然后点击 Default.aspx 按钮将 id 提交到数据库...
如果其他用户也在同一时间输入,则 id 将是相同的......直到他们按下 default.aspx 上的按钮
如何摆脱这个问题...这样...每个用户都将被分配唯一的 id ...
我使用读写代码生成唯一id ..
【问题讨论】:
【讨论】:
三个选项
使用 GUID:Guid.NewGuid() 将生成唯一的 GUID。当然,GUID 比整数长得多。
使用联锁操作来增加共享计数器。 Interlocked.Increment 是线程安全的。这只有在所有请求都发生在同一个 AppDomain 中时才有效:在刷新代码时循环的任何进程都会创建一个新的 AppDomain 并重新开始计数。
在数据库中使用 IDENTITY 列。数据库旨在处理此问题,在插入新行的请求中,使用SCOPE_IDENTITY 选择要在内存数据中更新的标识值(ORM 应该为您处理此问题)。 (这是 SQL Server,其他数据库也有同等功能。)
其中#3 几乎可以肯定是最好的。
【讨论】:
您可以生成一个 Guid:
Guid.NewGuid()
或者您可以让数据库在插入时为您生成它。一种方法是通过序列。请参阅Surrogate Keys 的维基百科文章
来自文章:
数据库中的代理键是建模世界中的实体或数据库中的对象的唯一标识符。代理键不是从应用程序数据派生的。
在手动查询数据库时(在调试期间),序列/自动递增列选项会更简单,更容易记住,但我工作的 DBA 表示,通过切换到 Guid,他的性能提高了 20%。他使用的是 Oracle,但他的数据库很大:)
【讨论】:
我使用实用的静态方法生成id,基本上使用完整的日期时间(包括秒)并生成一个随机数,比如3或4个字符并返回整个东西,然后你可以将它保存到数据库中。
【讨论】: