Entity framework 使用实体框架6事务
我有一系列关于EF 6中交易使用的问题。我使用以下代码模板进行数据库查询:Entity framework 使用实体框架6事务,entity-framework,transactions,azure-sql-database,Entity Framework,Transactions,Azure Sql Database,我有一系列关于EF 6中交易使用的问题。我使用以下代码模板进行数据库查询: using (var ctx = new MyContext(connectionString)) { using (var tx = ctx.Database.BeginTransaction(IsolationLevel.Snapshot)) { try { // query database ctx.
using (var ctx = new MyContext(connectionString))
{
using (var tx = ctx.Database.BeginTransaction(IsolationLevel.Snapshot))
{
try
{
// query database
ctx.SaveChanges();
tx.Commit();
}
catch(Exception ex)
{
tx.Rollback();
if(ex is A) // handle A
if(ex is B) // handle B
throw;
}
}
}
- 我将只查询数据库一次,只调用
一次。如果发生异常,是否需要回滚事务SaveChanges()
- 我的一些事务将只读取数据,因此我不会调用
。在这种情况下,我是否仍应调用SaveChanges()
Commit()
- 我正在考虑使用
实现连接弹性。在某一点上会发生瞬时故障吗?它是否仅在执行查询或调用SqlAzureExecutionStrategy
期间发生?如何初始化SaveChanges()
,ctx
,以及调用tx
?它们会导致这样的失败吗Commit()
- 是否有一种不那么紧凑的方式来查询事务内部的数据库?对于每个查询,我都需要使用上面的代码模板,它显著地复制了代码,例如两个using语句、try-catch块和通用异常处理。我相信最后一个可以通过派生
或SqlAzureExecutionStrategy
来实现。我完全支持尽可能多地重构代码DbExecutionStrategy
- 当您调用SaveChanges时,我相信实体框架将在单个事务中执行所有这些操作。当执行时,它会自动回滚。因此,您不必调用回滚。或者使用事务
- 实体框架在内部处理事务,当您必须在多个数据库上执行操作时,可以使用它
- 我不知道连接弹性的这个
。但是,.NETFramework 4.5.1中新的ADO.Net空闲连接弹性补充了此功能SqlAzureExecutionStrategy
using (var context = new ProductContext())
{
try
{
// Perform data access using the context
context.SaveChanges();
}
catch(Exception ex)
{
//handle exception
}
}
希望它能帮助您度过愉快的一天。我知道EF提供的默认事务不能防止不可重复的读取和幻影行。也可能存在需要在更广泛的事务中包含多个
context.SaveChanges()
。