具有两个数据库的数据库事务 - 这种方法是否正确?

时间:2013-09-09 07:32:02

标签: c# database entity-framework transactions transactionscope

我的情况是我有2个数据库。

经理有公司表,根据这个值,我必须创建一个新的数据库。

所以我使用的是TransactionScope。我想知道以下是正确的吗?

这会回滚这两个变化吗?在两个DB中如果发生错误?

using (TransactionScope ts = new TransactionScope())
{
    try
    {
        using(var ManagerContext = new ManagerEntities(
            ConnectionStringManager.GetManagerConnectionString()))
        {
            //Operations on Manager DB                         
            // Create new Company and get NEWCOMPANYID 
            // -- Used to create new DB
        }

        using(var companyContext = new CompanyEntities(
            ConnectionStringManager.GetCompanyConnectionString(
                NEWCOMPANYID.ToString())))
        {
            //Create New Company DB
        }

        ts.Complete();
    }
    catch (Exception ex)
    {
        ts.Dispose();
    }
}

2 个答案:

答案 0 :(得分:2)

只要这两个数据库上下文都TransactionScope知道,并且没有显式禁用环境事务(例如,在连接字符串中),那么是:那应该可以正常工作。如果我们假设两个连接字符串不同,那么肯定需要分布式事务(DTC),但是这是否正常取决于您。如果连接字符串相同,则可以改为使用LTM(减少开销/配置)。

请注意,根据评论,您不需要try / finally

答案 1 :(得分:2)

这没关系,虽然它会触发DTC,正如Marc所解释的那样。您可以使用两个上下文共享的单个SqlConnection(或EntityConnection)来避免DTC。您可以使用ChangeDatabase切换连接的当前数据库。这避免了对分布式事务的需求。

您还需要显式打开连接,因为默认情况下EF会打​​开并为每个操作关闭它。这导致多个DTC登记(超过2个)。这是EF的设计缺陷。