我有一个项目,我希望创建一个与db相关的概念分离,并重用建议。 我使用EF,与mysql(devart)连接器,我想创建一个事务,在一些表中创建一个注册表并将此注册表链接到其他表(如果发生其他事情则回滚)
我将提供一个虚拟场景来解释这个过程:
Generic.edmx:
Person {Id, Name, Address, ...}
MyApp.edmx (contains my app database, who uses Generic tables)
Person {Id, Name, Address, ...}
Schedule{ScheduleId, Date, PersonId(FK), ...}
一些关键点:
在我的方法createSchedule中,我需要创建一个人并将此人链接到计划。 我有一个方法已经创建了createPerson(...),它返回此Id。 我需要使用此Id链接到新的计划注册表,所以我想要这个事务操作,所以我创建一个事务范围,有两个上下文,第一个创建人,第二个创建计划。所有上下文都以ctx.saveChanges()结尾,但在第二个上下文中,我面临与锁表/注册表人员相关的异常(mysql超时)。 我知道这个新注册表尚未提交,因此,在第二个ctx中,此注册表不存在。
我已经尝试过Isolation Level = ReadUncommited。
public static int createSchedule(...){
using (TransactionScope transaction = new TransactionScope(
TransactionScopeOption.RequiresNew,
new TransactionOptions() {
I solationLevel = IsolationLevel.ReadUncommitted }))
{
var myId = createPerson(...);
using (var ctx = new MyAppDbEntity(MyConnStr))
{
Schedule sc = new Schedule{
Id = 1,
...
PersonId = myId,
...
};
//Logic code
ctx.Schedule.Add(sc);
ctx.saveChanges(); //Exception raised Here
transaction.Complete();
}
}
}
public static int createPerson(...){
using (var ctx = new GenericDbEntity(MyConnStr))
{
Person p = new Person{
Id = 10,
...
};
//Logic code
ctx.Person.Add(p);
ctx.saveChanges();
return p.Id;
}
}
解决我问题的任何解决方案?
答案 0 :(得分:0)
所有上下文以ctx.saveChanges()结尾,但在第二个上下文中,我面临与锁表/注册表人员相关的异常(mysql超时)。我知道这个新的注册表没有提交,所以,在第二个ctx中,这个注册表不存在。
我们无法在我们的环境中重现这个问题。请contact us我们会根据您的说明向您的电子邮件发送一个测试项目(有效)。
使用所有内部异常指定错误的完整堆栈跟踪。
使用dbMonitor来跟踪数据库活动。这应该有助于本地化您遇到的问题。