Zusammenhang mit transaktionalen Objekten auftritt, einzukreisen und bin
jetzt an einer Stelle, an der man das Problem so halbwegs nachvollziehen kann, bzw. erste Fragen auftauchen.<br>
Erstmal die Umgebung:<br>
Delphi6/E SP2, Windows 2000 Server SP2, MS-SQL Server 7 SP3<p>Einstellung am beteiligen COM+:<br>
Session Timeout: 60 sec. für alle Anwendungen<br>
<br>
Der Ablauf:<br>
</p>
<ul>
<li>Über RDS (W2K Client) wird auf einem entfernten Server (<font color="#008000">WebServer</font>)
eine <br>
Methode eines transaktionalen COM+ Objektes (<i>Neue Transaktion erforderlich</i>) <br>
aufgerufen<br>
z.B. <br>
<code>vRS := RDSConnection1.AppServer.GetIrgendeinRecordset (...)<br>
aRS := IUnknown(vRS) as _Recordset;<br>
</code>
<li>In der COM+ Methode auf dem Webserver wird über eine ADO-Connection <br>
ein Recordset von wiederum einem anderen entfernten SQL-Server (<font color="#008000">SQL-Server</font>)
abgeholt.<br>
Der Verbindungstyp in der SQL-Clientkonfiguration des WebServers zum
SQL-Server<br>
ist TCP/IP.<br>
z.B.<br>
.....<code><br>
// Connection öffnen<br>
try<br>
aConnection := CoConnection.Create as _Connection;<br>
aConnection.CursorLocation := adUseClient;<br>
aConnection.Open(CS, '', '', adConnectUnspecified);<br>
<br>
aRS := CoRecordset.Create as _Recordset;<br>
aRS.Open('Select * from IrgendeineTabelle', aConnection, adOpenStatic, adLockBatchOptimistic, 0);<br>
...<br>
Result := aRS;<br>
aRS._Set_ActiveConnection(nil);<br>
aConnection.close;<br>
SetComplete;<br>
except<br>
SetAbort;<br>
raise;<br>
end;<br>
</code><br>
Normalerweise funktioniert auch alles wunderbar. Der Webserver holt sein
Recordset und gibt es über die RDS Verbindung<br>
an den Client zurück.<br>
<li>Jetzt das sporadisch auftretende Problem:<br>
Wurde das Objekt auf dem WebServer nach seiner Aktivierung längere Zeit nicht
aufgerufen (die COM+ Anwendung<br>
ist bereits nach den eingestellten 5 min. heruntergefahren) und wird es dann<br>
wieder aufgerufen, passiert folgendes:<br>
Die COM+ Anwendung wird hochgefahren und danach meldet der Webserver
(manchmal)<br>
(bzw. sein DTC) <font color="#800000"><b>Fehler bei einer verteilten
Transaktion</b></font><br>
Der darauf folgende wiederholte Aufruf und alle weiteren klappen sofort - bis
zur nächsten<br>
'Ruhepause'. Der Fehler tritt allerdings NICHT immer auf.<br>
</ul>
<p>Hier meine Beobachtung:<br>
Irgendwann steht im Ereignisprotokoll des WebServers ein Eintrag vom
MSDTC (Kategorie CM):<code><br>
Zeichenfolgemeldung: Session idle timeout over, tearing down the session.<br>
(Ereignis-ID 4156)</code> <br>
Hier in diesem Forum gab es bereits schon einmal eine Diskussion darüber<br>
(<a href="http://www.entwickler-forum.de/webx?9@@.ee6b618">
http://www.entwickler-forum.de/webx?9@@.ee6b618</a>) <br>
und
auch Microsoft schreibt dazu unter <a href="http://support.microsoft.com/default.aspx?scid=kb;EN-US;q290334">http://support.microsoft.com/default.aspx?scid=kb;EN-US;q290334</a>
,<br>
dass diese Meldung ignoriert werden kann.<br>
<br>
Bei mir füllt dieser Eintrag jedoch fast das gesamte Ereignisprotokoll, so dass
ich vermute, dass der auftretende Fehler<br>
doch etwas damit zu tun hat. Und tatsächlich scheint er irgendetwas damit zu
tun zu haben, denn bei folgendem Ablauf<br>
ist das Problem (Fehler bei einer verteilten Transaktion) nachvollziehbar:</p>
Comment