我有一个静态的asp.net webmethod,它会在数据库中删除用户文件的操作。 file_name通过jQuery作为输入发送。但是对于DB连接,我需要使用静态DBconnection对象。
当多个用户从UI中删除自己的文件时,jQuery将使用相同的静态方法,该方法使用单个静态连接对象。 因此,同时出现多个请求,这将仅删除最后一个(最新请求)用户文件从数据库中删除吗?如果是这样,如何使用asp.net中的jquery-ajax来处理它。
如果我说错了,请说清楚。
[更新] 服务器端代码:
public static void DeleteAttachment(int fileId, string fileLoc)
{
SqlDBAccess objDBAccessStat = new SqlDBAccess();
.......
}
答案 0 :(得分:3)
您可以使用Webservice。
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: "WebService.asmx/WebMethodName",
data: "{}",
dataType: "json"
});
WebService方法不一定是静态的。
[System.Web.Script.Services.ScriptService]
public class WebService : System.Web.Services.WebService
{
[WebMethod]
public void WebMethodName()
{
//Do your stuff here
}
}
答案 1 :(得分:1)
显然,如果您同时共享多个请求之间的数据库连接,则无法确定将会发生什么。这是根据定义 undefined 。
你需要做的是要么隔离东西(使它成为非静态的),要么引入一个锁定来强制传入的请求无限期地等待(直到操作可用)。
这本身并不是特别困难,但要小心不要引入死锁。
我建议您不要将方法设置为静态,但非静态方法更加孤立并且与其自身连接对象一起使用时不会出现相同的并发问题。
重要的是,当多个用户点击该方法或 出错时,数据库连接不是全局共享资源。
只需将其更改为:
static void WebMethod()
{
using (var conn = ProviderFactory.CreateConnection("connection string goes here"))
{
conn.Open();
// Do work here
}
}
关于上述内容的简洁部分是,您不会仅仅因为默认情况下启用了连接池而假定使用SqlClient
数据库提供程序而使用连接向服务器发送垃圾邮件。但是,它会为您提供一个很好的隔离范围conn
来处理您的数据库。