简单的问题,但我无法在任何地方找到答案:是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更新的补偿逻辑.这种解决方案远非最佳.
亲切的问候,罗纳德威尔登伯格
这个问题在这里的一个简单例子中不易重现,但是想知道是否有人有任何经验和提示,这里是问题:
像这样:
using (TransactionScope txScope = new TransactionScope()) {
...
}
Run Code Online (Sandbox Code Playgroud)
但这给了我:
Microsoft分布式事务处理协调器(MSDTC)已禁用网络事务.
我们的数据库管理员告诉我,MSDTC被禁用,无法安装.
因此,我正在尝试使用MetadataWorkspace创建自己的EntityConnection,并认为每个上下文将使用相同的EntityConnection.然而,这证明几乎不可能试图让它工作,例如,即使理论上两个上下文都在使用EntityConnection,我仍然继续得到上述错误.例如,很难理解实体框架在何处/为何需要MSDTC.
有没有人走过这条路,有经验或代码示例分享?
使用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
我正在使用带有实体的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) 我们的团队遇到的问题表现为:
基础提供程序在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行
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) 我有一个使用MSDTC的相当大的应用程序.我应该打开多少个端口?有没有办法确定它?
编辑:我知道了什么端口,我需要打开,我不知道有多少,我需要.
在为SQL Server 2008创建SSIS包时,我遇到以下错误:
错误:由于错误0x8004D01B"事务管理器不可用",SSIS运行时无法启动分布式事务.DTC交易无法启动.这可能是因为MSDTC服务未运行.
我正在我的机器上本地创建和运行包,但数据库位于运行Windows Server 2008的服务器上,该服务器不在域中.
我确保DTC服务在本地和服务器上启动,并且我添加了在Windows Vista防火墙中预定义的防火墙例外.
为什么SSIS运行时无法启动分布式事务?
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)
知道为什么会这样吗?
稍后编辑:
它适用于我删除不需要的显式事务.当我放入BEGIN/COMMIT TRAN时,我仍然不清楚为什么会出现这个错误.
如果我在链接服务器上的多个表中有多个插入,我会得到相同的错误.
欢迎任何评论/评论.
我们正在使用MSDTC进行SQL事务.我遇到了为MSDTC设置防火墙工作的问题.应用程序和SQL在不同的机器上运行.目前MSDTC正在工作,如果我关闭应用程序服务器上的防火墙.我认为应该为某些端口的防火墙设置添加异常.因此防火墙仍然可以打开,DTC也不会有任何问题.我不确定在防火墙设置中添加的端口(我确实尝试添加端口135但没有成功)
我在服务器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
msdtc ×10
sql-server ×4
transactions ×3
firewall ×2
.net ×1
c# ×1
oracle10g ×1
ports ×1
ssis ×1