Ich habe einen sehr einfachen Code, der ADO.NET verwendet, der die ORA-08177-Ausnahme auslöst. Ich bin mir nicht sicher, was daran falsch ist. Ich versuche dies auf einem Windows Vista-Rechner, der Orakel 32-Bit-Client installiert hat. Meine Kompilieroption für Visual Studio ist auf x86-Plattform eingestellt.
%Vor%Wichtig zu beachten: (Ich bin mir nicht sicher, ob sie verbunden sind), aber ich habe dieses Problem nicht, wenn ich die neuesten Windows-Updates von meinem Computer deinstalliere.
Hat irgendjemand damit zu tun gehabt oder hat irgendeinen Hinweis darauf, was hier vor sich geht?
Bearbeiten: -
Ich habe einige Fortschritte, wo ich herausgefunden habe, dass dieses Problem nur auftritt, wenn wir Blob-Spaltentyp in Frage haben. für einfache Spalten funktioniert es gut.
Weitere Details (nicht sicher, ob das einen Unterschied macht)
Ich arbeite an 64-Bit-Windows-Vista-Business-Maschine. Ich habe 32-Bit-Oracle-Client für Windows Vista installiert (seit 64-Bit-Oracle-Client funktioniert nicht auf Vista). Ich kompiliere mein Projekt für ein x86 (32 Bit Umgebung) im Visual Studio. Und das ist eine Konsolenanwendung und ich weiß, dass niemand sonst die Datenbank zu dieser Zeit trifft. Es kann also nicht mehrere Transaktionen geben.
Und ich sehe dieses Problem nicht, wenn ich das neueste Windows-Update deinstalliere. (KB963027, KB967190, KB959426, KB960225, KB960803, KB952004, KB956572, KB958687, KB958690, KB958481, KB958483, KB943729)
Sie verwenden eine serialisierbare Transaktion, die auf eine andere Transaktion wartet, die dieselbe Tabelle auf ROLLBACK
sperrt.
Wenn diese andere Transaktion kein Rollback durchführt, sondern stattdessen festschreibt, erhalten Sie diesen Fehler.
Das Szenario scheint wie folgt zu sein:
Alice
öffnet ihre Browser-Sitzung, die DELETE FROM TABLE1 WHERE Version = 'v1'
Bob
öffnet seine Sitzung, die DELETE FROM TABLE1 WHERE Version = 'v1'
aufruft, nachdem Alice
es getan hat, aber bevor sie es getan hat. Bob
wartet, da Alice
die Zeilen mit Version = 'v1'
Alice
bestätigt ihre Transaktion
Bob
schlägt mit Cannot serialize access
Um dies zu umgehen, setzen Sie TRANSACTION ISOLATION LEVEL
auf READ COMMITTED
:
In diesem Fall wird die Abfrage von Bob
erneut ausgegeben, nachdem Alice
ihre Änderungen festgeschrieben hat, so als ob die Transaktion Bob
gestartet wurde, nachdem Alice
's committed wurde.
Aktualisieren
Könnten Sie bitte eine Spur Ihrer Verbindung posten?
Um dies zu tun, geben Sie diesen Befehl direkt nach dem Verbinden aus:
%Vor%, dann suchen Sie in $ORACLE_HOME\admin\udump
nach einer neuen *.trc
-Datei