标签: msdtc

Active Directory是否具有事务感知功能?

简单的问题,但我无法在任何地方找到答案:是Active Directory事务感知?

换句话说,将回滚以下更改(因为我没有调用scope.Complete()):

using (var scope = new TransactionScope())
{
    DirectoryEntry entry = ...;
    entry.Properties["givenName"].Value = "New Given Name";
    entry.CommitChanges();
}
Run Code Online (Sandbox Code Playgroud)

如果没有,是否有可能以某种方式启用它?现在我有代码执行数据库更新和相应的AD更新,如果它们以某种方式失败,我有AD更新的补偿逻辑.这种解决方案远非最佳.

亲切的问候,罗纳德威尔登伯格

.net msdtc transactions active-directory

16
推荐指数
1
解决办法
3023
查看次数

如何在没有MSDTC的情况下在TransactionScope中运行两个实体框架上下文?

这个问题在这里的一个简单例子中不易重现,但是想知道是否有人有任何经验和提示,这里是问题:

  • 使用实体框架
  • 在应用程序中有许多要点,其中(1)数据被写入某个实体表,例如Customer,(2)数据被写入历史
  • 这两个动作都使用实体框架,但是,它们使用不同的上下文
  • 这些操作需要同时在一个事务中:即如果一个人不能写,另一个不应该写,等等.
  • 我可以用TransactionScope包装它们,

像这样:

using (TransactionScope txScope = new TransactionScope()) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

但这给了我:

Microsoft分布式事务处理协调器(MSDTC)已禁用网络事务.

我们的数据库管理员告诉我,MSDTC被禁用,无法安装.

因此,我正在尝试使用MetadataWorkspace创建自己的EntityConnection,并认为每个上下文将使用相同的EntityConnection.然而,这证明几乎不可能试图让它工作,例如,即使理论上两个上下文都在使用EntityConnection,我仍然继续得到上述错误.例如,很难理解实体框架在何处/为何需要MSDTC.

有没有人走过这条路,有经验或代码示例分享?

msdtc entity-framework transactions

16
推荐指数
1
解决办法
1万
查看次数

EF:如何在交易中两次调用SaveChanges?

使用Entity Framework(在我的例子中是代码),我有一个操作,需要我调用SaveChanges来更新DB中的一个对象,然后再次SaveChanges来更新另一个对象.(我需要第一个SaveChanges来解决EF无法确定首先更新哪个对象的问题).

我试过做:

using (var transaction = new TransactionScope())
{
    // Do something

    db.SaveChanges();

    // Do something else

    db.SaveChanges();

    tramsaction.Complete();
}
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我在第二次SaveChanges调用时遇到异常,说"底层提供程序在打开时失败".内部异常表示我的机器上未启用MSDTC.

现在,我在其他地方看到了描述如何启用MSDTC的帖子,但似乎我还需要启用网络访问等.这听起来像是完全矫枉过正,因为没有涉及其他数据库,更不用说其他服务器了.我不想做一些会使我的整个应用程序不那么安全(或更慢)的东西.

当然必须有一个更轻量级的方法(理想情况下没有MSDTC)?!

msdtc entity-framework transactionscope sql-server-2012 entity-framework-5

15
推荐指数
3
解决办法
1万
查看次数

MVC 3:MSDTC事务管理器无法从源中提取事务

我正在使用带有实体的MVC 3,现在我已经使用了我的控制器中的以下代码行

        using (var scope = new TransactionScope())
        {
            _myRepository.DeleteFM1(id);
            _myRepository.DeleteFM2(id, name);
            scope.Complete();
        }
Run Code Online (Sandbox Code Playgroud)

在我的DeleteFM2方法中,恰好是我在Entity类中定义的方法,如下所示:

    public void DeleteFM2(int id, string name)
    {
        var data= _repositoryMD.Fetch().Where(mColl => mColl.Col1 == id);

        if (data!= null)
        {
                //insert here is giving some error MSDTC error !
                // here I prepare a message using the '**data**'
                _repositoryHistory.Insert(name, message, "FM2", "Delete", dateTime);


                _repositoryMD.Attach(data);
                _repositoryMD.Delete(data);
                _repositoryMD.SaveChanges();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我有一个单独的类,我已将Insert方法定义为

   public bool Insert(string realName, string logMessage, string tableName, string changeType, DateTime dateTime)
    {
        var history …
Run Code Online (Sandbox Code Playgroud)

sql-server msdtc entity-framework asp.net-mvc-3

14
推荐指数
3
解决办法
4万
查看次数

TransactionScope - 基础提供程序在EnlistTransaction上失败.MSDTC被中止

我们的团队遇到的问题表现为:

基础提供程序在EnlistTransaction上失败; 无法访问已处置的对象.对象名称:'Transaction'.

在此输入图像描述

一旦我们开始使用TransactionScope来处理我们的应用程序的事务,它似乎就出现了.

堆栈跟踪的顶部部分被捕获为:

在System.Data.EntityClient.EntityConnection.EnlistTransaction(事务事务)处于System.Data.Objects.ObjectContext.EnsureConnection(),位于Reconciliation.Models的System.Data.Objects.ObjectContext.ExecuteStoreCommand(String commandText,Object [] parameters).在EntityDbEnvironment.cs中的Reconciliation.Models.Legacy.EntityDbEnvironment.ExecuteOracleSql(String sql)中的BillLines.BillLines.Reconciliation.Interfaces.IBillLineEntities.ExecuteStoreCommand(String,Object []):第41行

同时更新MSDTC日志,我已使用此处说明进行了提取:

pid=7060       ;tid=7908       ;time=04/29/2013-16:38:30.269   ;seq=136        ;eventid=TRANSACTION_BEGUN                        ;tx_guid=60f6390c-7570-488a-97a9-2c3912c4ca3e     ;"TM Identifier='(null)                                            '" ;"transaction has begun, description :'<NULL>'"
pid=7060       ;tid=7908       ;time=04/29/2013-16:38:30.269   ;seq=137        ;eventid=RM_ENLISTED_IN_TRANSACTION               ;tx_guid=60f6390c-7570-488a-97a9-2c3912c4ca3e     ;"TM Identifier='(null)                                            '" ;"resource manager #1002 enlisted as transaction enlistment #1. RM guid = 'defc4277-47a6-4cd9-b092-93a668e2097b'"
pid=7060       ;tid=7908       ;time=04/29/2013-16:38:31.658   ;seq=138        ;eventid=RECEIVED_ABORT_REQUEST_FROM_BEGINNER     ;tx_guid=60f6390c-7570-488a-97a9-2c3912c4ca3e     ;"TM Identifier='(null)                                            '" ;"received request to abort the transaction from beginner"
pid=7060       ;tid=7908       ;time=04/29/2013-16:38:31.658   ;seq=139        ;eventid=TRANSACTION_ABORTING                     ;tx_guid=60f6390c-7570-488a-97a9-2c3912c4ca3e     ;"TM Identifier='(null)                                            '" ;"transaction …
Run Code Online (Sandbox Code Playgroud)

c# msdtc entity-framework transactionscope oracle10g

14
推荐指数
2
解决办法
1万
查看次数

MSDTC - 需要多少个端口

我有一个使用MSDTC的相当大的应用程序.我应该打开多少个端口?有没有办法确定它?

编辑:我知道了什么端口,我需要打开,我不知道有多少,我需要.

msdtc firewall ports

13
推荐指数
2
解决办法
2万
查看次数

为什么SSIS运行时无法启动分布式事务?

在为SQL Server 2008创建SSIS包时,我遇到以下错误:

错误:由于错误0x8004D01B"事务管理器不可用",SSIS运行时无法启动分布式事务.DTC交易无法启动.这可能是因为MSDTC服务未运行.

我正在我的机器上本地创建和运行包,但数据库位于运行Windows Server 2008的服务器上,该服务器不在域中.

我确保DTC服务在本地和服务器上启动,并且我添加了在Windows Vista防火墙中预定义的防火墙例外.

为什么SSIS运行时无法启动分布式事务?

sql-server msdtc ssis

13
推荐指数
2
解决办法
2万
查看次数

BEGIN TRY/CATCH和MSDTC错误

1 /以下代码片段显示了预期的错误:INSERT语句与FOREIGN KEY约束FK _...冲突.

SET XACT_ABORT ON;

BEGIN TRANSACTION

    INSERT INTO linkedsrv1.db1.[dbo].tbl1 ([Col1], [Col2])  
    VALUES (1200, 0)                

COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)

2 /但是当我把它放在BEGIN TRY/CATCH中时,错误消息是模糊的:消息1206,级别18,状态118,行18 Microsoft分布式事务处理协调器(MS DTC)已取消分布式事务.

SET XACT_ABORT ON;

BEGIN TRY  
    BEGIN TRANSACTION   

        -- Error is on this line
        INSERT INTO linkedsrv1.db1.[dbo].tbl1 ([IdWebsite], [IdProductType])  
        VALUES (1200, 0)   

    COMMIT TRANSACTION
END TRY  
BEGIN CATCH
    PRINT 'Error' -- Code not reached

    SELECT ERROR_NUMBER(), ERROR_MESSAGE(), ERROR_SEVERITY(), ERROR_STATE()

    IF XACT_STATE() != 0   
        ROLLBACK TRANSACTION
END CATCH
Run Code Online (Sandbox Code Playgroud)

知道为什么会这样吗?

稍后编辑:

  1. 它适用于我删除不需要的显式事务.当我放入BEGIN/COMMIT TRAN时,我仍然不清楚为什么会出现这个错误.

  2. 如果我在链接服务器上的多个表中有多个插入,我会得到相同的错误.

欢迎任何评论/评论.

sql-server msdtc

13
推荐指数
2
解决办法
8230
查看次数

MSDTC和防火墙

我们正在使用MSDTC进行SQL事务.我遇到了为MSDTC设置防火墙工作的问题.应用程序和SQL在不同的机器上运行.目前MSDTC正在工作,如果我关闭应用程序服务器上的防火墙.我认为应该为某些端口的防火墙设置添加异常.因此防火墙仍然可以打开,DTC也不会有任何问题.我不确定在防火墙设置中添加的端口(我确实尝试添加端口135但没有成功)

msdtc firewall

12
推荐指数
1
解决办法
2万
查看次数

由于通信问题,MSDTC事务管理器无法从源事务管理器中提取事务

我在服务器1上托管了我的Webapp,在服务器2上托管了我的数据库

但我得到了跟随错误

"与基础交易经理的沟通失败了."

我用Google搜索并发现一个帖子,其中提到了DTC(分布式事务)的问题我在server2(数据库服务器)上启用了DTC,并在防火墙中对它进行了例外处理.

在此输入图像描述

在此输入图像描述

但仍然是同样的错误.

这是完整的堆栈跟踪

消息:System.Transactions.TransactionManagerCommunicationException:与基础事务管理器的通信失败.---> System.Runtime.InteropServices.COMException:由于通信问题,MSDTC事务管理器无法从源事务管理器中提取事务.可能的原因是:存在防火墙且MSDTC进程没有例外,两台计算机无法通过其NetBIOS名称找到对方,或者两个事务管理器之一未启用对网络事务的支持.(从HRESULT异常:0x8004D02B)在System.Transactions.Oletx.IDtcProxyShimFactory.ReceiveTransaction(UInt32的propgationTokenSize,字节[] propgationToken,IntPtr的managedIdentifier,的Guid&transactionIdentifier,OletxTransactionIsolationLevel&的IsolationLevel,ITransactionShim&transactionShim)在System.Transactions.TransactionInterop.GetOletxTransactionFromTransmitterPropigationToken(字节[] propagationToken)

好心劝告

sql-server msdtc transactions windows-server-2003 windows-server-2008

12
推荐指数
2
解决办法
3万
查看次数