我有一个Web应用程序(ASP.net 2.0),它在后台有一个数据库(SQL Server)。如果两个用户同时将相同的数据插入同一个表,我正在考虑如何处理数据库并发。有办法处理这个案子吗?提前谢谢。
麦
答案 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,他们将无济于事。