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);
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。