Asp.net mvc asp.net mvc应用程序中的实体框架和事务

Asp.net mvc asp.net mvc应用程序中的实体框架和事务,asp.net-mvc,entity-framework,transactions,Asp.net Mvc,Entity Framework,Transactions,我对asp.net应用程序中的事务管理有疑问 例如,我有计划假期的申请 财务总监有批准休假的表格 一个用户-单击保存并批准想要休假的员工-1天 第二个用户-点击保存并批准假期和 //pseudocode public void ApproveVacation(int vacationId) { //pull vacationdata from db var vacation = _dbContext.Vacations.FirstOrDefaul

我对asp.net应用程序中的事务管理有疑问

例如,我有计划假期的申请

财务总监有批准休假的表格

一个用户-单击保存并批准想要休假的员工-1天 第二个用户-点击保存并批准假期和

//pseudocode

    public void ApproveVacation(int vacationId)
    {
        //pull vacationdata from db
        var vacation = _dbContext.Vacations.FirstOrDefault(x => x.Id == vacationId);
        if (vacation != null && vacation.State != approved) //
        {
            using (TransactionScope scope = new TransactionScope())
            {
                vacation.state = approved;
                vacation.Employee.Days = -1;
                _dbContext.saveChanges();
                scope.complete();
            }
        }
    }
问题很简单,对于这个场景,事务是否足够,或者我必须使用一种并发技术

谢谢


编辑:每个请求创建一个上下文。

调用“SaveChanges”时,您已经有一个隐式事务,因此不需要事务范围


而且,如果要更改多个项目,则需要在检索数据之前启动TransactionScope。

事务处理操作的原子性,因此,如果操作修改多个数据库记录,则如果操作成功或回滚所有更改,则始终会导致一致的状态,其中所有记录都被正确修改如果操作失败

并发处理多个进程/用户可能对同一记录进行的修改,因为两个进程/用户都可以加载记录的原始版本,但一个进程可以先保存该记录,因此当第二个进程尝试保存记录时,它可以无提示地覆盖以前的更改


那个么,你们试图在代码中处理什么呢?

好吧,我尝试处理这种情况,例如,当两个或更多的用户点击表单按钮并发送批准休假的请求时。我只需要在第一个请求中更改vactaion状态一次,所以您需要并发机制——例如使用时间戳。