前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >abp工作单元uow死锁

abp工作单元uow死锁

原创
作者头像
旋浮球
发布2023-01-18 14:21:34
4290
发布2023-01-18 14:21:34
举报
文章被收录于专栏:旋浮球的笔记本

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

代码语言:c#
复制
[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);
}
代码语言:c#
复制
[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();
}
代码语言:javascript
复制
[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);
}

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

代码语言:c#
复制
[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);
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档