假设我想使用Entity Framework 4.0在我的SQL Server数据库中插入一个新的Experiment
:Experiment
中包含1..*Tasks
。Experiment
和Task
都来自EntityObject
此外,还有一个数据库约束,每个Task
必须有一个“parent”Experiment
链接到它
插入必须是原子的。我所说的atomic是指数据库上的读卡器永远不能读取未完全写入数据库的Experiment
,例如没有Experiment
的Task
。
到目前为止,我尝试过的所有解决方案都存在这样一个问题:即使只有几秒钟,也可以读取一些不完整的实验;也就是说,实验最终很快就完成了任务,但不是原子性的。
更具体地说,
我的reader.exe在while(true)
循环中读取所有实验并转储没有任务的实验。
并行地,我用一个任务一个接一个地写1000个实验,并将它们保存到数据库中。
我找不到写我的writer.exe
和ReadAllExperiments
函数的方法,这样我就不会读不完整的实验。
我该怎么做?
附言:
我是数据库新手;我在写时尝试过具有可序列化隔离级别的事务,使用updlock手动读取sql请求,等等,但是没有成功解决这个问题,所以我陷入了困境。
我认为很简单的基本需求可能会暴露出不适定问题?
此处对问题进行单元测试:
Entity Framework Code First: SaveChanges is not atomic
最佳答案
下面的代码应该实际执行在假设您没有使用read uncommitted或类似的隔离级别进行读取之后的操作
using(var ctx = new MyContext())
{
var task = new Task{};
ctx.Tasks.Add(task);
ctx.Experiment.Add(new Experiment{ Task = task });
ctx.SaveChanges();
}
如果在这种情况下使用读未提交或类似的任务,在实验被添加之前,任务将显示出来,我不相信在给定您所描述的约束的任务之前,应该有一个实验可以存在的状态。