一个数据库事务中可否包含两个不同的连接
完全可以哟,假设两个不同的连接串分别是A、B;先开启A库的事务如果没有异常的情况下,也就是A库执行成功,此时不要急着提交事务。接着开启B库的事务。如果B库执行成功,那么提交A库事务,提交B库事务!成功!假设A事务中异常。那么直接回滚A事务跳出,不处理B库事务!假设A库执行成功,B库异常!那么回滚B库事务,再回滚A库事务!
public static bool UseTransaction(List<string> sqlA, List<string> sqlB)
{
using (IDbContext contextA = DbHelper.Context("A连接串", new SqlServerProvider()).UseTransaction(true)) //假设A设采用的是 SqlServer 数据库
{
try
{
//这里处理A库的SQL...
foreach (var sql in sqlA)
{
contextA.Sql(sql).Execute();
}
using (IDbContext contextB = DbHelper.Context("B连接串", new OracleProvider()).UseTransaction(true)) //假设A设采用的是 Oracle 数据库
{
try
{
//这里处理B库的SQL...
foreach (var sql in sqlB)
{
contextA.Sql(sql).Execute();
}
contextB.Commit();//提交B库事务
contextA.Commit();//提交A库事务
return true;//两个库事务都成功了
}
catch (Exception)
{
contextB.Rollback();//回滚B库事务
contextA.Rollback();//回滚A库事务
return false;
}
}
}
catch (Exception) //A库异常
{
contextA.Rollback();//回滚A库事务
return false;
}
}
}