惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

爱范儿
爱范儿
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
G
GRAHAM CLULEY
www.infosecurity-magazine.com
www.infosecurity-magazine.com
V2EX - 技术
V2EX - 技术
The Last Watchdog
The Last Watchdog
S
Secure Thoughts
Webroot Blog
Webroot Blog
PCI Perspectives
PCI Perspectives
L
LINUX DO - 最新话题
Hacker News: Ask HN
Hacker News: Ask HN
N
News and Events Feed by Topic
H
Heimdal Security Blog
H
Help Net Security
T
The Blog of Author Tim Ferriss
P
Proofpoint News Feed
The GitHub Blog
The GitHub Blog
Jina AI
Jina AI
Recent Commits to openclaw:main
Recent Commits to openclaw:main
F
Full Disclosure
小众软件
小众软件
S
Securelist
罗磊的独立博客
NISL@THU
NISL@THU
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
Cisco Blogs
云风的 BLOG
云风的 BLOG
C
CERT Recently Published Vulnerability Notes
Cisco Talos Blog
Cisco Talos Blog
Know Your Adversary
Know Your Adversary
S
Schneier on Security
D
DataBreaches.Net
M
MIT News - Artificial intelligence
V
Vulnerabilities – Threatpost
N
News and Events Feed by Topic
有赞技术团队
有赞技术团队
F
Fortinet All Blogs
T
Tenable Blog
The Register - Security
The Register - Security
C
Check Point Blog
AWS News Blog
AWS News Blog
Cloudbric
Cloudbric
C
CXSECURITY Database RSS Feed - CXSecurity.com
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
C
Cyber Attacks, Cyber Crime and Cyber Security
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Google Online Security Blog
Google Online Security Blog
博客园 - 叶小钗
Hacker News - Newest:
Hacker News - Newest: "LLM"
博客园 - 司徒正美

博客园 - 狂野都城

后台线程处理 FMS3.5 的logs 日志目录配置 C#磁盘大小管理操作类 C#建立IIS虚拟目录站点 IO操作类 同步和异步方式获取网页源代码! 判断一幅图片是否是黑色,灰度直方图 winform窗体置前 关于FMS服务端数据流发布 如何配置FMS边缘服务器 Windows服务“允许服务与桌面交互”的使用和修改方法 招聘:Flash视频开发程序员(网络多媒体应用) 招聘:windows mobile 手机应用软件的开发 Word 2007 里头鼠标失效(滚轮除外) ,困扰多天! 终止线程 Response.End 在Asp.net 里面的正确使用 Access 中查询TOP语句的奇怪问题??? 一道小学数学题... net常用代码 (收藏) 在VS2005 开发中使用Codesmith 和NetTiers 模版开发相关
一次分布式事务管理器(MSDTC)的事务处理异常的排错
狂野都城 · 2012-08-10 · via 博客园 - 狂野都城

这两天,因为一台MS SQL2005服务器的系统有些问题,重启后不能正常登录系统,采取了恢复上次正确配置的方式登录。原来一直运行无问题的程序,在添加新记录的时候,出现事务错误。而在编辑,删除等均正常。

我的网络环境是一台是Web服务器,一台是数据服务器,同一机房,相同网段,IP不一样。

事务异常错误提示如下:

System.Transactions.TransactionManagerCommunicationException: 已禁用对分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具启用 DTC 以便在 MSDTC 安全配置中进行网络访问。 ---> System.Runtime.InteropServices.COMException (0x8004D024): 该事务管理器已经禁止了它对远程/网络事务的支持。 (异常来自 HRESULT:0x8004D024)
   在 System.Transactions.Oletx.IDtcProxyShimFactory.ReceiveTransaction(UInt32 propgationTokenSize, Byte[] propgationToken, IntPtr managedIdentifier, Guid& transactionIdentifier, OletxTransactionIsolationLevel& isolationLevel, ITransactionShim& transactionShim)
   在 System.Transactions.TransactionInterop.GetOletxTransactionFromTransmitterPropigationToken(Byte[] propagationToken)
   --- 内部异常堆栈跟踪的结尾 ---
   在 System.Transactions.Oletx.OletxTransactionManager.ProxyException(COMException comException)
   在 System.Transactions.TransactionInterop.GetOletxTransactionFromTransmitterPropigationToken(Byte[] propagationToken)
   在 System.Transactions.TransactionStatePSPEOperation.PSPEPromote(InternalTransaction tx)
   在 System.Transactions.TransactionStateDelegatedBase.EnterState(InternalTransaction tx)
   在 System.Transactions.EnlistableStates.Promote(InternalTransaction tx)
   在 System.Transactions.Transaction.Promote()
   在 System.Transactions.TransactionInterop.ConvertToOletxTransaction(Transaction transaction)
   在 System.Transactions.TransactionInterop.GetExportCookie(Transaction transaction, Byte[] whereabouts)
   在 System.Data.SqlClient.SqlInternalConnection.GetTransactionCookie(Transaction transaction, Byte[] whereAbouts)
   在 System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx)
   在 System.Data.SqlClient.SqlInternalConnection.Enlist(Transaction tx)
   在 System.Data.SqlClient.SqlInternalConnectionTds.Activate(Transaction transaction)
   在 System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction)
   在 System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
   在 System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
   在 System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
   在 System.Data.SqlClient.SqlConnection.Open()
   在 System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser user)
   在 System.Data.Linq.SqlClient.SqlProvider.get_IsSqlCe()
   在 System.Data.Linq.SqlClient.SqlProvider.InitializeProviderMode()
   在 System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
   在 System.Data.Linq.Table`1.System.Linq.IQueryProvider.Execute[TResult](Expression expression)
   在 System.Linq.Queryable.FirstOrDefault[TSource](IQueryable`1 source, Expression`1 predicate)
   在 GCEVideoMonitor.BLL.SiteInfo.GetDeviceTypeKey(Int32 deviceTypeId, Int32 rtType)
   在 GCEVideoMonitor.Manage.Monitor.MonitorChannelManage.AddSubmit(Object sender, EventArgs e)

一开始,以为是MSDTC的问题,但我的MSDTC均有开启,根据错误提示“已禁用对分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具启用 DTC 以便在 MSDTC 安全配置中进行网络访问”在网上搜索,配置与网上所说一致,尝试了所有的方法,异常依然如此。后来也出现过下面的异常现象:

System.Transactions.TransactionManagerCommunicationException: 与基础事务管理器的通信失败。 ---> System.Runtime.InteropServices.COMException (0x80004005): 对 COM 组件的调用返回了错误 HRESULT E_FAIL。
   在 System.Transactions.Oletx.IDtcProxyShimFactory.ReceiveTransaction(UInt32 propgationTokenSize, Byte[] propgationToken, IntPtr managedIdentifier, Guid& transactionIdentifier, OletxTransactionIsolationLevel& isolationLevel, ITransactionShim& transactionShim)
   在 System.Transactions.TransactionInterop.GetOletxTransactionFromTransmitterPropigationToken(Byte[] propagationToken)
   --- 内部异常堆栈跟踪的结尾 ---
   在 System.Transactions.TransactionInterop.GetOletxTransactionFromTransmitterPropigationToken(Byte[] propagationToken)
   在 System.Transactions.TransactionStatePSPEOperation.PSPEPromote(InternalTransaction tx)
   在 System.Transactions.TransactionStateDelegatedBase.EnterState(InternalTransaction tx)
   在 System.Transactions.EnlistableStates.Promote(InternalTransaction tx)
   在 System.Transactions.Transaction.Promote()
   在 System.Transactions.TransactionInterop.ConvertToOletxTransaction(Transaction transaction)
   在 System.Transactions.TransactionInterop.GetExportCookie(Transaction transaction, Byte[] whereabouts)
   在 System.Data.SqlClient.SqlInternalConnection.GetTransactionCookie(Transaction transaction, Byte[] whereAbouts)
   在 System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx)
   在 System.Data.SqlClient.SqlInternalConnection.Enlist(Transaction tx)
   在 System.Data.SqlClient.SqlInternalConnectionTds.Activate(Transaction transaction)
   在 System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction)
   在 System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
   在 System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
   在 System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
   在 System.Data.SqlClient.SqlConnection.Open()
   在 System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser user)
   在 System.Data.Linq.SqlClient.SqlProvider.get_IsSqlCe()
   在 System.Data.Linq.SqlClient.SqlProvider.InitializeProviderMode()
   在 System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
   在 System.Data.Linq.Table`1.System.Linq.IQueryProvider.Execute[TResult](Expression expression)
   在 System.Linq.Queryable.FirstOrDefault[TSource](IQueryable`1 source, Expression`1 predicate)
   在 GCEVideoMonitor.BLL.SiteInfo.GetDeviceTypeKey(Int32 deviceTypeId, Int32 rtType)
   在 GCEVideoMonitor.Manage.Monitor.MonitorChannelManage.AddSubmit(Object sender, EventArgs e)

仔细分析,并开启代码调试,发现“GCEVideoMonitor.BLL.SiteInfo.GetDeviceTypeKey(Int32 deviceTypeId, Int32 rtType)" 这个地方引起异常,把这个方法的代码直接放在事务过程中使用,不调用该方法,这个地方的异常不再产生。

在添加带有事务的新记录,测试,出现下面的异常信息:

System.Transactions.TransactionException: 此操作对该事务的状态无效。 ---> System.TimeoutException: 事务超时
   --- 内部异常堆栈跟踪的结尾 ---
   在 System.Transactions.TransactionState.EnlistPromotableSinglePhase(InternalTransaction tx, IPromotableSinglePhaseNotification promotableSinglePhaseNotification, Transaction atomicTransaction)
   在 System.Transactions.Transaction.EnlistPromotableSinglePhase(IPromotableSinglePhaseNotification promotableSinglePhaseNotification)
   在 System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx)
   在 System.Data.SqlClient.SqlInternalConnection.Enlist(Transaction tx)
   在 System.Data.SqlClient.SqlInternalConnectionTds.Activate(Transaction transaction)
   在 System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction)
   在 System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
   在 System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
   在 System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
   在 System.Data.SqlClient.SqlConnection.Open()
   在 System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser user)
   在 System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult)
   在 System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries)
   在 System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
   在 System.Data.Linq.ChangeDirector.StandardChangeDirector.DynamicInsert(TrackedObject item)
   在 System.Data.Linq.ChangeDirector.StandardChangeDirector.Insert(TrackedObject item)
   在 System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode)
   在 System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)
   在 GCEVideoMonitor.DAL.GCEVideoMonitor3DataContext.SubmitChanges(ConflictMode failureMode) 位置 E:\正式项目VM2\GCE3.0\GCETeam\GCE3.0\GCEVideoMonitor\GCEVideoMonitor.DAL\Entities\GCEVideoMonitor3DataContext.Manager.cs:行号 56
   在 System.Data.Linq.DataContext.SubmitChanges()
   在 GCEVideoMonitor.DAL.GCEVideoMonitor3DataContext.SaveChanges() 位置 E:\正式项目VM2\GCE3.0\GCETeam\GCE3.0\GCEVideoMonitor\GCEVideoMonitor.DAL\Entities\GCEVideoMonitor3DataContext.Generated.cs:行号 999
   在 GCEVideoMonitor.Manage.Monitor.MonitorChannelManage.AddSubmit(Object sender, EventArgs e) 位置 E:\正式项目VM2\GCE3.0\GCETeam\GCE3.0\GCEVideoMonitor\GCEVideoMonitor.Manage\Monitor\MonitorChannelManage.aspx.cs:行号 161

该异常,网上有解析:

使用方式不当,主要有两种吧:
1,先调用了事务,再去打开数据库连接
2,在一个事务里面嵌套了另外一个事务

因此,在代码里面修改如下:

 using (var ts = new System.Transactions.TransactionScope())
 {

  using (var dc = BLL.SiteInfo.CreateDBDataContext())
   {

      ....

   }

}               

变更为:

using (var dc = BLL.SiteInfo.CreateDBDataContext())
 {

 using (var ts = new System.Transactions.TransactionScope())
   {

      ....

   }

}       

成功添加了记录,所有异常解决。

另外,我发觉我的电脑不能添加记录,但在同事的电脑,他却可以添加记录,而不产生异常,是非常诡异的地方。

无语,随笔以便后来者。