Linq to sql 简单交易

Linq to sql 简单交易,linq-to-sql,transactions,msdtc,Linq To Sql,Transactions,Msdtc,我有两条linq 2 SQL语句,我想在事务中使用(SQL server是远程的,在防火墙之外等)所有其他通信都可以工作,但当我将这两条语句包装在TransactionScope()中时,我开始必须像我们那样配置MSDTC,但随后会出现防火墙问题(我想)有更简单的方法吗 我想做的基本工作归结为以下几点:(两者都是存储在引擎盖下的进程) 最简单的方法是什么 编辑: 首先,我发现:事务管理器已禁用对远程/网络事务的支持。(来自HRESULT的异常:0x8004D024) 在我们的服务器上,我按照说明

我有两条linq 2 SQL语句,我想在事务中使用(SQL server是远程的,在防火墙之外等)所有其他通信都可以工作,但当我将这两条语句包装在TransactionScope()中时,我开始必须像我们那样配置MSDTC,但随后会出现防火墙问题(我想)有更简单的方法吗

我想做的基本工作归结为以下几点:(两者都是存储在引擎盖下的进程)

最简单的方法是什么

编辑:
首先,我发现:事务管理器已禁用对远程/网络事务的支持。(来自HRESULT的异常:0x8004D024) 在我们的服务器上,我按照说明进行了更正。但是,这些说明似乎不适用于windows 7(我的开发框),请参阅我对上述答案的评论

在纠正了这个问题(在非win7框上)之后,我得到了以下信息:事务已经被隐式或显式提交或中止(HRESULT的例外:0x8004D00E),这可能是一些谷歌搜索的防火墙问题

编辑

我刚刚发现,如果将两个更新发送到两个不同的数据库,.net TransactionScope类需要MSDTC的帮助来协调事务,那么远程数据库就是SQL 2000。SQL server 2005或更高版本,如果两个更新位于同一数据库中,则不涉及MSDTC

MSDTC是在com+组件服务中配置的,请选择您的计算机名,然后选择属性,基本上您应该选择无身份验证

下面的链接可能会有所帮助


如果将两个更新发送到两个不同的数据库,.net TransactionScope类需要MSDTC的帮助来协调事务。SQL server 2005或更高版本,如果两个更新位于同一数据库中,则不涉及MSDTC

MSDTC是在com+组件服务中配置的,请选择您的计算机名,然后选择属性,基本上您应该选择无身份验证

下面的链接可能会有所帮助


您总是可以创建一个新的存储过程,在它自己的事务中执行这两个SP?Quick n'dirty…

您总是可以创建一个新的存储过程,在它自己的事务中执行这两个SP?Quick n'dirty…

TransactionScope
是一种方法,如果您不想乱用SQL的话。我不熟悉通过防火墙进行交易,也不知道有什么问题。您能发布您遇到的异常/错误吗


如果它真的给您带来了问题,您可以创建一个存储过程来包装这些问题,并在包装好的存储过程中执行事务。

TransactionScope
是一种方法,如果您不想乱用SQL的话。我不熟悉通过防火墙进行交易,也不知道有什么问题。您能发布您遇到的异常/错误吗


如果它真的给您带来了问题,您可以创建一个存储过程来包装这些问题,并在包装好的存储过程中执行事务。

当您在事务期间只需要处理一个数据库时,您只需创建并打开一个新的
SqlConnection
。这可以防止您需要使用
事务处理范围
。以下是一个例子:

using (var con = new SqlConnection("constr"))
{
    con.Open();
    using (var tran = con.BeginTransaction())
    {
        using (var context = new YourDataContext(con))
        {
            // Do stuff
            context.SubmitChanges();
            int generatedId = /* get this id */
            // Do stuff with id

            context.SubmitChanges();
        }
    }
}

因为您使用的是
存储库
,所以您必须在后台创建上下文,但想法是一样的。不要忘记处理数据库事务和连接。

当您在事务期间只需要处理一个数据库时,只需创建并打开一个新的
SqlConnection
。这可以防止您需要使用
事务处理范围
。以下是一个例子:

using (var con = new SqlConnection("constr"))
{
    con.Open();
    using (var tran = con.BeginTransaction())
    {
        using (var context = new YourDataContext(con))
        {
            // Do stuff
            context.SubmitChanges();
            int generatedId = /* get this id */
            // Do stuff with id

            context.SubmitChanges();
        }
    }
}

因为您使用的是
存储库
,所以您必须在后台创建上下文,但想法是一样的。不要忘记处理数据库事务和连接。

ahhh我刚刚发现远程服务器正在使用SQL 2000 ahhh我刚刚发现远程服务器正在使用SQL 2000