我有一个带有回发按钮的网页,连接到外部数据库以下载一些数据并执行一些数据库更新。我遇到的问题是两个或更多人同时运行此下载或在功能仍在运行时运行此下载的可能性,这可能会导致问题。
如何创建某种形式的信号量,以便在第二个人单击按钮时,他会收到一条消息,说它当前正在更新?
在您的外部数据库上使用适当的事务并根据需要在那里应用行锁定;数据库系统应该可以很好地处理并发。
乍一看,我会使用一个包含在 lock 语句中的 ASP.NET 应用程序变量来检查并在需要时更新它。
protected void Page_Load(object sender, EventArgs e)
{
if (!GetSem_SomeoneIsDownloading())
{
PerformDownload();
ClearSem_SomeoneIsDownloading();
}
else
{
DisplayMessageSomeoneIsDownloadingAlready();
}
}
bool GetSem_SomeoneIsDownloading()
{
bool isSomeoneDownloading;
Application.Lock();
isSomeoneDownloading = (bool)(Application["SomeoneIsDownloading"] ?? false);
if (!isSomeoneDownloading)
Application["SomeoneIsDownloading"] = true;
Application.UnLock();
return isSomeoneDownloading;
}
void ClearSem_SomeoneIsDownloading()
{
Application.Lock();
Application["SomeoneIsDownloading"] = false;
Application.UnLock();
}