【发布时间】:2017-12-01 11:40:18
【问题描述】:
我在同一个 SQL Server 实例上有两个数据库
在“DatabaseA”中,我有一个存储过程,它调用 C# 代码(SQL 中的 CLR 程序集)来解压数据,并在解压后将解压后的数据写入 DatabaseB 的表(ScanTracking、Strings、Numerics)
手动执行的存储过程工作得很好。
但是,当我通过触发器在 DatabaseA 中存在的表上运行存储过程时。我收到以下错误
'事务上下文被另一个会话使用'
错误的完整细节如下:
Msg 6522, Level 16, State 1, Procedure ExecuteDeSerializeBulk, Line 0
A .NET Framework error occurred during execution of user-defined routine or aggregate "ExecuteDeSerializeBulk":
System.Data.SqlClient.SqlException: Transaction context in use by another session.
System.Data.SqlClient.SqlException:
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte[] buffer, TransactionManagerRequestType request, String transactionName, TransactionManagerIsolationLevel isoLevel, Int32 timeout, SqlInternalTransaction transaction, TdsParserStateObject stateObj, Boolean isDelegateControlRequest)
at System.Data.SqlClient.SqlInternalConnectionTds.PropagateTransactionCookie(Byte[] cookie)
at System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx)
at System.Data.SqlClient.SqlInternalConnection.Enlist(Transaction tx)
at System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction)
at System.Data.ProviderBase.DbConnectionPool.PrepareConnection(DbConnection owningObject, DbConnectionInternal obj, Transaction transaction)
at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnecti...
The statement has been terminated.
我做了一些研究,发现了以下链接
Transaction context in use by another session
我没有使用链接服务器或任何复杂的东西,我的两个数据库都在同一台服务器上。
作为一种解决方法,我恢复为每 5 分钟运行一次的 SQL 代理作业,并将数据解压到 DatabaseB 上,这工作正常。但是我的想法告诉我,我没有找到触发器问题的解决方案,也没有使用 SQL 代理作业解决它。
任何想法或建议都会有很大帮助。
【问题讨论】:
-
是否启用了调用触发器 MARS 的会话?你在使用 TransactionScope 吗?
-
@mjwills - 谢谢我为你更新了问题。如果您现在可以通过完整的异常详细信息了解更多信息,请告诉我。顺便说一句,很好的比喻。我期待您自己的建议。
-
请向我们展示
ExecuteDeSerializeBulk的源代码、触发器和更新数据库的 C# 代码(因此“触发触发器”)。
标签: c# sql-server stored-procedures triggers sqlclr