Web应用程序数据库并发

时间:2008-12-05 09:59:34

标签: database concurrency

我有一个Web应用程序(ASP.net 2.0),它在后台有一个数据库(SQL Server)。如果两个用户同时将相同的数据插入同一个表,我正在考虑如何处理数据库并发。有办法处理这个案子吗?提前谢谢。

4 个答案:

答案 0 :(得分:4)

要防止同时插入相同的数据,请在要使其唯一的列上使用唯一索引。第一个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();

答案 1 :(得分:1)

您只需要:

BEGIN TRANSACTION;
INSERT XXXXXX INTO TABLE1 ......
INSERT YYYYY  INTO TABLE2 ........
COMMIT;
if (commit_failed) { tell user to try again!; };

SQLserver将负责其余部分。

答案 2 :(得分:1)

如果您试图阻止重复,最简单的答案是在您想要唯一的列上创建一个UNIQUE索引。

如果您试图阻止多个用户同时修改同一记录,最好的办法是将最后修改的时间戳添加到表中。当您阅读要在屏幕上显示的记录时,您会读取时间戳,并在写入更改之前再次检查时间戳。如果它已经改变,那意味着另一个用户修改了记录,你应该阻止改写。

答案 3 :(得分:0)

不知道你的C#代码如何与数据库对话(O / R,ADO.NET ......),很难给你一个有用的答案......

编辑:所有的例子都很棒,但如果他使用SubSonic,他们将无济于事。