以下代码位于循环中,执行多次。当我执行以下代码时,它偶尔会生成一个外键异常,这很好,因为它被处理并且我尝试回写事务。但是,在下一次运行时它会生成相同的异常,并且即使数据是正确的也会一遍又一遍地执行。
我们有一个存储上下文的单例类:
public class MyDatabaseContext
{
private static MyDatabaseContext _instance;
public static MyDatabaseContext_Instance
{
get
{
if (_instance == null)
{
_instance = new MyDatabaseContext();
}
return _instance;
}
}
public MyEntities Context;
private MyDatabaseContext()
{
Context = new MyEntities();
}
}
}
减少循环主要部分的版本:
MyEntities entities = MyDatabaseContext.Instance.Context;
// Begin new transaction
entities.Connection.Open();
DbTransaction transaction = entities.Connection.BeginTransaction();
try {
// Inside the update, we modify some data and call saveChanges() on the same
// database context, see below
dataObject.Update()
// do more stuff to data here
if (dataObject.isValid())
{
transaction.Commit();
}
} catch (Exception ex) {
// Rollback transaction
transaction.Rollback();
} fincally {
entities.Connection.Close();
}
这是Update()方法,它导致异常
public static Update() {
// get same database context
MyEntities entities = MyDatabaseContext.Instance.Context;
// Update data, wont show here, but a foreign key is set to 0 which
//will cause an exception
entities.saveChanges() // Exception thrown here!
}
答案 0 :(得分:0)
MS SQL不支持嵌套事务。很可能您已经处于事务中,因此Begin / Commit / Rollback是逻辑事务而不是物理数据库事务。
尝试使用SQL事件探查器检查它以查看实际发生的情况。
简单(但不是最好的)解决方案是,只要你Rollback
,你实际上需要关闭连接并重新开始。