Transaction context in use by another session
Asked Answered
B

8

18

I have a table called MyTable on which I have defined a trigger, like so:

CREATE TRIGGER dbo.trg_Ins_MyTable
   ON  dbo.MyTable 
   FOR INSERT
AS 
BEGIN
    SET NOCOUNT ON;

    insert SomeLinkedSrv.Catalog.dbo.OtherTable 
        (MyTableId, IsProcessing, ModifiedOn)
    values (-1, 0, GETUTCDATE())
END
GO

Whenever I try to insert a row in MyTable, I get this error message:

Msg 3910, Level 16, State 2, Line 1 Transaction context in use by another session.

I have SomeLinkedSrv properly defined as a linked server (for example, select * from SomeLinkedSrv.Catalog.dbo.OtherTable works just fine).

How can I avoid the error and successfully insert record+execute the trigger?

Boisvert answered 22/5, 2012 at 14:54 Comment(7)
does there happen to also be a trigger on SomeLinkedSrv.Catalog.Dbo.OtherTable?Oxyhydrogen
@Oxyhydrogen - no, OtherTable has no triggers definedBoisvert
Is It happening in an explicit transaction? Is DTC turned on on both servers?Oxyhydrogen
Have you tried implementing this as an instead of trigger? What type of transaction are you using for the original insert? Have you considered logging this locally and using a background process to update the remote server (this way the remote server does not complicate the primary transaction, and the primary transaction does not have to wait for the remote operation).Honestly
@Oxyhydrogen for the moment I'm testing this on my dev machine; I'm connected to the local SQLSserver instance and the linked server points to tha tsame instance. MSDTC is running.Boisvert
@AaronBertrand 1. instead of fails with the same error. 2. No (explicit) transaction; just a plain insert MyTable (<fields>) values (<values>). 3. Yes, that will surely do it, but it involves some work. I was wondering if it's possible to solve this directly in TSQL.Boisvert
Another question about "Transaction context in use by another session": #2859250Frunze
O
26

Loopback linked servers can't be used in a distributed transaction if MARS is enabled.

Loopback linked servers cannot be used in a distributed transaction. Trying a distributed query against a loopback linked server from within a distributed transaction causes an error, such as error 3910: "[Microsoft][ODBC SQL Server Driver][SQL Server]Transaction context in use by another session." This restriction does not apply when an INSERT...EXECUTE statement, issued by a connection that does not have multiple active result sets (MARS) enabled, executes against a loopback linked server. Note that the restriction still applies when MARS is enabled on a connection.

http://msdn.microsoft.com/en-us/library/ms188716(SQL.105).aspx

Oxyhydrogen answered 22/5, 2012 at 15:27 Comment(0)
C
2

I solve It. I was using the same linked server to call the second procedure and then into the procedure I was using the same linked server.

It's very Easy, only we have to know the restricctions of linked servers.

Curiosa answered 20/11, 2015 at 17:45 Comment(0)
W
1

I have resolved it by removing linked server used in the stored procedure and then called stored procedure by the same linked server. It wasnt working in DEV environement.

Wilding answered 15/11, 2016 at 19:47 Comment(0)
G
1

One of causes of this situation is a trigger that works for linked-sever database table. An also SQL version of SQL-Server which processes database matters. To avoid this ERROR during sql query execution we should temporarily disable and after execution enable triggers for tables updated. All with database name check. Here is an example:

     Select * From People  where PersonId In (@PersonId, @PersonIdRight)
     IF 'DOUBLE' = DB_NAME()
        ALTER TABLE [dbo].[PeopleSites] DISABLE TRIGGER [PeopleSites_ENTDB_UPDATE]

     Update PeopleSites Set PersonId = @PersonIdRight Where  PersonId = @PersonId

     IF 'DOUBLE' = DB_NAME()
        ALTER TABLE [dbo].[PeopleSites] ENABLE TRIGGER [PeopleSites_ENTDB_UPDATE]


     Select * From PeopleSites where PersonId In (@PersonId, @PersonIdRight)
Glimp answered 19/5, 2020 at 12:22 Comment(0)
R
0

I also got the same error in our DEV environemnt, moving the linked databases to another sql instance resolved the issue. In our production environment these databases are already on separate instances

Reject answered 29/10, 2014 at 11:34 Comment(0)
T
0

In my case I was using SQL 2005 and got "transaction context in use by another session" when running Insert....exec over a linked server. The fix for me was to patch from SP2 build 3161 to SP3. SP2 cumulative 5 is supposed to fix though.

https://support.microsoft.com/en-us/kb/947486

Tailback answered 12/2, 2016 at 16:38 Comment(0)
S
0

When remote database sits on the same server,configure the linked server without specifying the database server ip / hostname and port. Just the database name should be sufficient.

Spoondrift answered 5/9, 2016 at 10:7 Comment(0)
M
0

I was getting the same "transaction context in use by another session error" when trying to run an UPDATE query:

 BEGIN      TRAN
--ROLLBACK  TRAN
--COMMIT    TRAN
UPDATE  did 
SET     did.IsProcessed = 0,
        did.ProcessingLockID = NULL
FROM    [proddb\production].DLP.dbo.tbl_DLPID did (NOLOCK)
WHERE   did.dlpid IN ('bunch of GUIDs')
--WHERE   did.DLPID IN (SELECT DLPID FROM @TableWithData)

However I didn't realize I was already trying to run this on the DLP database on the ProdDb\Production server. Once I removed that "[proddb\production].DLP.dbo." prefix from the query, it worked fine.

Muscadel answered 17/7, 2019 at 15:10 Comment(0)

© 2022 - 2025 — McMap. All rights reserved.