Hallo,<br>ich versuche seit einiger Zeit, ein merkwürdiges Phänomen, das im
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>
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