使用 2 个 DBContext 开始事务
Begin transaction with 2 DBContexts
想法:我正在尝试 运行 使用 2 个不同的 dbContext 插入到 2 个数据库,目标是允许角色从两个 QB 返回插入,以防以太之一出现异常插入。
我的代码:
using (var db1 = new DbContext1())
{
db1.Database.Connection.Open();
using (var trans = db1.Database.Connection.BeginTransaction())
{
//do the insertion into db1
db1.SaveChanges();
using (var db2 = new DbContext2())
{
//do the insertions into db2
db2.SaveChanges();
}
trans.Commit();
}
}
第一次调用保存更改时:db1.SaveChanges();我收到无效操作异常:sqlconnection 不支持并行事务
我试图弄清楚它的确切含义、为什么会发生以及如何解决它,但一直未能实现。
所以我的问题是:
这到底是什么意思?为什么我会得到这个例外?
我该如何解决?
有没有一种方法可以使用不同的方式来使用 begin transaction 而不会导致此错误?
此外,这是使用 begin transaction 的正确方法还是我应该做一些不同的事情?
*** 为了澄清起见,我使用的是 db1.Database.Connection.Open();因为否则我会收到 "connection is close" 错误。
与其尝试将您的连接和事务扩展到两个 DbContext
,不如在 DbContext
之外处理您的连接和事务,像这样:
using (var conn = new System.Data.SqlClient.SqlConnection("yourConnectionString"))
{
conn.Open();
using (var trans = conn.BeginTransaction())
{
try
{
using (var dbc1 = new System.Data.Entity.DbContext(conn, contextOwnsConnection: false))
{
dbc1.Database.UseTransaction(trans);
// do some work
// ...
dbc1.SaveChanges();
}
using (var dbc2 = new System.Data.Entity.DbContext(conn, contextOwnsConnection: false))
{
dbc2.Database.UseTransaction(trans);
// do some work
// ...
dbc2.SaveChanges();
}
trans.Commit();
}
catch
{
trans.Rollback();
}
}
}
我发现我只是在滥用语法,所以为了帮助任何可能偶然发现这个问题的人,这是正确的方法:
using (var db1 = new DbContext1())
{
using (var trans = db1.Database.BeginTransaction())
{
try
{
//do the insertion into db1
db1.SaveChanges();
using (var db2 = new DbContext2())
{
//do the insertions into db2
db2.SaveChanges();
}
trans.Commit();
}
catch (Exception e)
{
trans.Rollback();
}
}
}
想法:我正在尝试 运行 使用 2 个不同的 dbContext 插入到 2 个数据库,目标是允许角色从两个 QB 返回插入,以防以太之一出现异常插入。
我的代码:
using (var db1 = new DbContext1())
{
db1.Database.Connection.Open();
using (var trans = db1.Database.Connection.BeginTransaction())
{
//do the insertion into db1
db1.SaveChanges();
using (var db2 = new DbContext2())
{
//do the insertions into db2
db2.SaveChanges();
}
trans.Commit();
}
}
第一次调用保存更改时:db1.SaveChanges();我收到无效操作异常:sqlconnection 不支持并行事务
我试图弄清楚它的确切含义、为什么会发生以及如何解决它,但一直未能实现。
所以我的问题是: 这到底是什么意思?为什么我会得到这个例外? 我该如何解决? 有没有一种方法可以使用不同的方式来使用 begin transaction 而不会导致此错误?
此外,这是使用 begin transaction 的正确方法还是我应该做一些不同的事情?
*** 为了澄清起见,我使用的是 db1.Database.Connection.Open();因为否则我会收到 "connection is close" 错误。
与其尝试将您的连接和事务扩展到两个 DbContext
,不如在 DbContext
之外处理您的连接和事务,像这样:
using (var conn = new System.Data.SqlClient.SqlConnection("yourConnectionString"))
{
conn.Open();
using (var trans = conn.BeginTransaction())
{
try
{
using (var dbc1 = new System.Data.Entity.DbContext(conn, contextOwnsConnection: false))
{
dbc1.Database.UseTransaction(trans);
// do some work
// ...
dbc1.SaveChanges();
}
using (var dbc2 = new System.Data.Entity.DbContext(conn, contextOwnsConnection: false))
{
dbc2.Database.UseTransaction(trans);
// do some work
// ...
dbc2.SaveChanges();
}
trans.Commit();
}
catch
{
trans.Rollback();
}
}
}
我发现我只是在滥用语法,所以为了帮助任何可能偶然发现这个问题的人,这是正确的方法:
using (var db1 = new DbContext1())
{
using (var trans = db1.Database.BeginTransaction())
{
try
{
//do the insertion into db1
db1.SaveChanges();
using (var db2 = new DbContext2())
{
//do the insertions into db2
db2.SaveChanges();
}
trans.Commit();
}
catch (Exception e)
{
trans.Rollback();
}
}
}