如何在实体框架中设置事务级别
本文关键字:设置 事务 框架 实体 | 更新日期: 2023-09-27 18:08:01
我有下面的方法
public void UpdateQuantity()
{
Sql ss = new Sql();
M3 m3 = new M3();
TransactionOptions ff = new TransactionOptions();
ff.IsolationLevel = IsolationLevel.ReadUncommitted;
using (TransactionScope dd = new TransactionScope(TransactionScopeOption.Required, ff))
{
try
{
ss.AddRegion("ALFKI", "SES1"); //step 1
m3.UpdateAnotherSystem(); //step2
dd.Complete();
}
catch (Exception)
{
}
}
}
public void AddRegion(string customerName, string Deception)
{
using (NorthWind context = new NorthWind())
{
Region rr = new Region();
rr.RegionID = 5;
rr.RegionDescription = "Ssaman";
context.Regions.Add(rr);
try
{
context.SaveChanges();
}
catch (Exception)
{
throw;
}
}
}
首先我要更新Sql server数据库,然后我要在其他系统上执行另一个更新。如果步骤2失败(可能是网络故障),那么我需要逆转步骤1。在这里,我将两个方法调用放在事务作用域中。我使用实体框架与sql工作。实体框架总是将事务隔离级别设置为已读提交(根据sql分析器)。
但我的问题是context.SaveChanges()调用后我的目标表被锁定,直到事务完成(dd.Complete())。
是否有办法改变实体框架事务隔离级别?(我的实体框架版本是5)。
SQL Server在事务结束之前不会释放由于写操作而占用的锁。这样就可以回滚写操作。你对此无能为力。
结束您的事务,或者接受写的行仍在使用的事实。通常情况下,这不是问题。对于HTTP请求或WCF请求中发生的大多数工作,您可能应该具有单个上下文、连接和事务。事务本身不会阻塞。
using (var context = new BloggingContext())
{
using (var dbContextTransaction = context.Database.BeginTransaction())
{
try
{
context.Database.ExecuteSqlCommand(
@"UPDATE Blogs SET Rating = 5" +
" WHERE Name LIKE '%Entity Framework%'"
);
var query = context.Posts.Where(p => p.Blog.Rating >= 5);
foreach (var post in query)
{
post.Title += "[Cool Blog]";
}
context.SaveChanges();
dbContextTransaction.Commit();
}
catch (Exception)
{
dbContextTransaction.Rollback();
}
}
}