EF6提交的数据读
问题描述:
我需要像下面进行交易:EF6提交的数据读
- 开始交易:在这里,我呼吁
context.Database.BeginTransaction()
(请注意context
这里就不下同一个的问题,我想读未提交) - 保存联系(使用存储过程完成):此usp也有一个事务。
- 创建基于接触一些其他记录
- 提交
我遇到的问题是,在步骤3,我需要从数据库中读取一些数据(使用EF应用端做),这尚未提交(从第2步开始)。我试图这样做,但它不工作:
context.Database.ExecuteSqlCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;");
var contact = context.Contact.SingleOrDefault(x => x.ContactId == intId);
context.Database.ExecuteSqlCommand("SET TRANSACTION ISOLATION LEVEL READ COMMITTED;");
我有调试器中运行,并在其中contact
,正在获取的暂停,但什么都不会返回。
如果我查询的SSMS(SQL服务器MGMT工作室)相同的记录,它返回的结果:
set transaction isolation level read uncommitted
select * from Contact c where c.ContactId = 9999
问题
- 我怎样才能读取使用EF6未提交的数据?一些在线搜索引导我创建一个自定义拦截器,但我真的需要吗?
- 许多文章建议不读取未提交的数据,但我想不出另一种方式来实现这一点。在那儿?
答
您可以尝试包装你的数据库访问代码在TransactionScope
,像这样:
using (var scope = new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions() { IsolationLevel = IsolationLevel.ReadUncommitted }))
你是如何开始你的交易?我问,因为如果代码流如您所描述的那样,则步骤2和步骤3中的所有操作都应该在同一个事务中完成,并且该事务应该能够看到同一事务中先前操作所做的任何更改。
您也可以尝试使用SQL Server Profiler来观察数据库交互并查看是否正在创建其他(新)事务。
如果您发布了执行步骤1至4的实际代码,它可能会有所帮助。
+0
我编辑了我的问题,是的,还有其他交易。 – CodingYoshi
实际上步骤1是什么?如果你做了'var tr = context.Database.BeginTransaction();',那么使用同样''context''的未来操作应该看到那个事务中未提交的变化。 –
@IvanStoev它只是'this.context.Database.BeginTransaction();'但这与问题中的不一样。 – CodingYoshi
我明白了。然后尝试'BeginTransaction(System.Data.IsolationLevel.ReadUncommitted)',它似乎工作(快速测试)。 –