假设我想插入一个新的Experiment
在我的 SQL Server 数据库中,使用实体框架 4.0:
-
Experiment
有 1..*Tasks
in it
- Both
Experiment
and Task
从获得EntityObject
- 此外,还有一个数据库约束,即每个
Task
必须有一个“父母”Experiment
链接到它
插入必须是原子的。我所说的原子性是指数据库的读者永远无法读取Experiment
未完全写入数据库,例如Experiment
没有Task
.
到目前为止我尝试过的所有解决方案都存在这样的问题:即使只持续几秒钟,也可以读取一些不完整的实验;即实验最终会快速但不是原子地填充其任务。
进一步来说,
- 我的 reader.exe 读入
while(true)
循环所有实验并转储没有任务的实验。
- 同时我的
writer.exe
编写约 1000 个实验,一项一项地完成一项任务,并将它们保存到数据库中。
我找不到写我的方法ReadAllExperiments
and WriteOneExperiment
功能使我永远不会阅读不完整的实验。
我该怎么做呢?
PS:
我是数据库新手;我尝试了写入时具有可序列化隔离级别的事务、使用 UPDLOCK 进行读取的手动 SQL 请求等,但没有成功解决这个问题,所以我陷入了困境。
我认为相当基本且简单的需求可能会揭示出不适定问题?
问题在这里进行了单元测试:实体框架代码优先:SaveChanges 不是原子的 https://stackoverflow.com/questions/16693609/entity-framework-code-first-savechanges-is-not-atomic
在假设你是之后,以下内容实际上应该执行你的操作not使用 READ UNCOMMITTED 或类似隔离级别进行读取
using(var ctx = new MyContext())
{
var task = new Task{};
ctx.Tasks.Add(task);
ctx.Experiment.Add(new Experiment{ Task = task });
ctx.SaveChanges();
}
如果您在这种情况下使用 READ UNCOMMITTED 或类似的任务,任务将在添加实验之前显示,我认为在给定您所描述的约束的情况下,不应该存在实验可以在任务之前存在的状态。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)