ASP.Net MVC 5和SQL事务隔离级别

时间:2015-08-17 02:48:23

标签: c# asp.net-mvc sql-server-2014 snapshot-isolation

在为数据库创建前端时遇到问题。我从数据库开始使用EF6 Code First。我创建了控制器并在创建页面上运行测试,但遇到了一个大问题。它给了我以下错误:

 System.Data.SqlClient.SqlException: Transaction failed in database 'DB' because the statement was run under snapshot isolation but the transaction did not start in snapshot isolation. You cannot change the isolation level of the transaction to snapshot after the transaction has started unless the transaction was originally started under snapshot isolation level.

出现的另一件事是来自控制器的代码:

if (ModelState.IsValid)
{
    db.Characters.Add(character);
    await db.SaveChangesAsync();
    return RedirectToAction("Index");
}

它强调了等待db.SaveChangesAsync();作为错误行。所以现在我对在哪里寻找改变MVC代码中的事务级别感到困惑。它是Web.config,为数据库或控制器创建的模型吗?我知道我必须使用TransactionScope来改变它 更容易将默认事务范围更改为数据库设置的范围。只是不确定在哪里做出改变?

1 个答案:

答案 0 :(得分:0)

EF上下文的构造函数中,您可以调用以下内容传递您想要的IsolationLevel

_ContextTransaction = Database.BeginTransaction(isolationLevel)

然后通过覆盖上下文中的SaveChangesAsync,您可以提交事务

public override Task<int> SaveChangesAsync() {
    var result = base.SaveChangesAsync();
    _ContextTransaction.Commit();

}

请注意,您还需要Commit其他Saving方法的事务,并且您也可以考虑在开始使用{{1}的新事务之前测试上下文是否是另一个事务的一部分}

要检查当前交易,您可以使用BeginTransaction(isolationLevel)