【发布时间】:2015-07-06 08:08:04
【问题描述】:
我有一个事务将大量数据(超过 5000 多条记录)插入 3 个表(因此需要一段时间),这没关系,但我注意到一些令人不安的事情。在此过程中,所有 3 个表似乎都被锁定了。
插入交易:
using(var db = new MyEntities())
{
using (var tr = db.Database.BeginTransaction())
{
// blah, blah, a lot of entities to create, **some custom SQL, bulk inserts** etc.
db.SaveChanges();
tr.Commit();
}
}
无论是 EF 还是原始 SQL 查询,我都无法从表中读取数据。但是使用 (NOLOCK) 选择有效:
SELECT * FROM Table1 WITH (NOLOCK)
首先我想知道实际发生了什么?是否只是“自然”行为和表被锁定,或者可能是锁定升级或其他原因。
其次,是否可以禁用插入事务级别的锁?还是我必须在所有 SELECT 查询中添加“WITH (NOLOCK)”?
第三,是否可以让 SELECT 查询在保存期间返回数据,但仅来自已提交事务的记录(例如,我的插入事务已经添加了 2000 条记录,3000 条待处理,我进行了一个选择查询,它返回除了那些之外的所有记录2000,尚未提交)。
【问题讨论】:
-
你在那里明确地使用了一个事务,那么为什么要读取提交的数据,你必须等到事务被提交才会让你感到惊讶?
标签: sql-server entity-framework transactions