【发布时间】:2008-12-05 09:59:34
【问题描述】:
我有一个在后台有一个数据库 (SQL Server) 的 Web 应用程序 (ASP.net 2.0)。如果两个用户同时将相同的数据插入同一个表,我正在考虑如何处理数据库并发。有什么办法可以处理这种情况吗?提前致谢。
吉米
【问题讨论】:
标签: database concurrency
我有一个在后台有一个数据库 (SQL Server) 的 Web 应用程序 (ASP.net 2.0)。如果两个用户同时将相同的数据插入同一个表,我正在考虑如何处理数据库并发。有什么办法可以处理这种情况吗?提前致谢。
吉米
【问题讨论】:
标签: database concurrency
为防止同时插入相同的数据,请在您希望唯一的列上使用唯一索引。第一个INSERT会成功,正确处理失败的INSERT的错误。
为防止 2 个以上的用户同时修改同一(现有)记录,请使用乐观并发http://en.wikipedia.org/wiki/Optimistic_concurrency_control。使用 SQL Server,使用TIMESTAMP 列很容易实现乐观并发。使用您的数据读取时间戳。更新行时,检查时间戳值是否相同。如果时间戳不匹配,则用户有(正在查看)过时的行。妥善处理这种情况。
使用 SqlClient 的示例:
command.CommandText = @"
UPDATE tbl
SET LastName = @LastName, FirstName = @FirstName
WHERE ID = @ID AND Timestamp = @Timestamp
";
int rowCount = command.ExecuteNonQuery();
if (rowCount != 1)
throw new DBConcurrencyException();
【讨论】:
你只需要:
开始交易; 将 XXXXXX 插入表 1 ...... 将 YYYYY 插入表 2 ........ 犯罪; if (commit_failed) { 告诉用户再试一次!; };SQLserver 会处理剩下的事情。
【讨论】:
如果您想防止重复,最简单的答案是在您希望唯一的列上创建一个 UNIQUE 索引。
如果您试图阻止多个用户同时修改同一记录,最好的办法是在表中添加最后修改的时间戳。当您阅读要在屏幕上显示的记录时,您会阅读时间戳,并且在您编写更改之前再次检查时间戳。如果它已更改,则意味着另一个用户已修改该记录,您应该阻止写入更改。
【讨论】:
如果不知道您的 C# 代码如何与数据库(O/R、ADO.NET...)对话,很难给您一个有用的答案...
编辑:所有示例都很棒,但如果他使用 SubSonic 示例,它们将无济于事。
【讨论】: