大体是这样的,我定义了一个同步方法,客户端把数据上传到该方法进行数据保存。方法体里启用了一个事务进行写入:
[HttpPost("PushFileData")]
public ActionResult PushFileData([FromBody] Web_PushFileData file)
{
if (file == null) return BadRequest();
else if (file.Path.Equals("NULL")) return Accepted(); //不同步根目录,因为根目录无法比较谁最新
【 bool b = this.dbService.PushFileData(this.testUserID, file); 】//里面开启了事务
if (b == true)
{
return Ok(); //(成功)服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。
}
else
{
return Accepted(); //(已接受)服务器已接受请求,但尚未处理。
}
}
之前该方法若改为异步,会有类似”已经有另一个开启的事务“的异常警告,毕竟分配了两个线程同时执行方法,就变成多事务冲突。把方法改为同步之后,若是多个用户同时调用该方法,会不会也将产生多事务冲突?
接口访问并发真的会产生。如果要避免的话,可以使用排队机制。
类似于生产者和消费者的模式。
题中是一个Web请求方法,如何做排队?
同步跟异步跟事务冲突貌似没关系
不管是同步还是异步,都是请求资源
并发请求资源都会产生冲突
至于你说的多事务冲突,那是数据库层面的冲突,看看数据库的事务级别而定
请教下Web项目遇到这种并发情况通常如何做数据库事务?
@PER10:
你是说在这个方法使用异步方法报错吗?
原因是默认情况下TransactionScope不会从一个线程切换到另一个线程。用 TransactionScopeAsyncFlowOption.Enabled:
using(var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
var groups = await Context.ProductGroups.ToListAsync()。ConfigureAwait(false);
}