zl程序教程

您现在的位置是:首页 >  Javascript

当前栏目

abp工作单元uow死锁

2023-02-25 18:21:31 时间

ASP.NET Core Controller Actions(一个http请求)会被默认构建为一个工作单元。若在此工作单元内,再次发起一个http请求,并且更新同一条数据,则会造成死锁。

[HttpGet(Name = "UpdateUserInformation")]
public async Task<ActionResult> UpdateUserInformation()
{
    XM.XFQ.SmallSeparation.Domain.User.User newUser = null;
    XM.XFQ.SmallSeparation.Domain.User.User user = new XM.XFQ.SmallSeparation.Domain.User.User
    {
        Username = "Admin",
        Password = "123456"
    };
    //更新操作
    newUser = await _userService.UpdateUser(user);
    //发起新的http请求
    Test();
    return Json(newUser);
}
[HttpGet(Name = "Test")]
public async void Test()
{
    string serviceAddress = "https://localhost:xxxx/api/User/UpdateUserInformation2";
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(serviceAddress);
    request.Method = "GET";
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    var stream = response.GetResponseStream();
    string result = new StreamReader(stream, System.Text.Encoding.UTF8).ReadToEnd();
}
[HttpGet(Name = "UpdateUserInformation2")]
public async Task<ActionResult> UpdateUserInformation2()
{
    XM.XFQ.SmallSeparation.Domain.User.User newUser = null;
    XM.XFQ.SmallSeparation.Domain.User.User user = new XM.XFQ.SmallSeparation.Domain.User.User
    {
        Username = "Admin",
        Password = "123456"
    };
    //更新同一条数据
    newUser = await _userService.UpdateUser(user);
    return Json(newUser);
}

尽量避免该类型的业务逻辑出现。若无法避免,则可以通过缩小事务粒度来解决。

[HttpGet(Name = "UpdateUserInformation")]
public async Task<ActionResult> UpdateUserInformation()
{
    XM.XFQ.SmallSeparation.Domain.User.User newUser = null;
    XM.XFQ.SmallSeparation.Domain.User.User user = new XM.XFQ.SmallSeparation.Domain.User.User
    {
        Username = "Admin",
        Password = "123456"
    };
    //更新完成后,提交事务
    using (var uow = _unitOfWorkManager.Begin(requiresNew: true))
    {
        newUser = await _userService.UpdateUser(user);
        await uow.CompleteAsync();
    }
    //发起新的http请求
    Test();
    return Json(newUser);
}