【发布时间】:2025-11-28 13:05:01
【问题描述】:
我需要执行如下交易:
- 开始交易:这里我叫
context.Database.BeginTransaction()(请注意这里的context不是我想读未提交的问题下面的那个) - 保存联系人(使用存储过程完成):此 usp 也有交易。
- 根据联系人创建一些其他记录(使用 EF 应用程序端完成)
- 提交
我遇到的问题是,在第 3 步中,我需要从数据库中读取一些尚未提交的数据(从第 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 server mgmt studio) 中查询相同的记录,它会返回结果:
set transaction isolation level read uncommitted
select * from Contact c where c.ContactId = 9999
问题
- 如何使用 EF6 读取未提交的数据?一些在线搜索让我创建了一个自定义拦截器,但我真的需要吗?
- 许多文章建议不要读取未提交的数据,但我想不出另一种方法来实现这一点。有吗?
【问题讨论】:
-
第 1 步究竟是什么?如果您执行
var tr = context.Database.BeginTransaction();,那么使用相同context的未来操作应该会看到该事务中未提交的更改。 -
@IvanStoev 它只是
this.context.Database.BeginTransaction();,但这与问题中的上下文不同。 -
我明白了。那就试试
BeginTransaction(System.Data.IsolationLevel.ReadUncommitted),好像可以(快测)。 -
@IvanStoev 我试过了,但也没有用。你认为是因为有多个交易吗?一个是在应用程序中使用
BeginTransaction启动的,还有一个是在存储过程级别?换句话说,交易中的交易。 -
可能是。在我的测试中,我使用了 2 个数据库上下文和 2 个(应用程序级别)事务。
标签: c# sql-server-2012 entity-framework-6