ORA-08177: Der Zugriff für diese Transaktion kann nicht serialisiert werden

8

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)

    
MOZILLA 24.04.2009, 13:07
quelle

1 Antwort

19

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:

  1. Alice öffnet ihre Browser-Sitzung, die DELETE FROM TABLE1 WHERE Version = 'v1'

    aufruft
    • Bob öffnet seine Sitzung, die DELETE FROM TABLE1 WHERE Version = 'v1' aufruft, nachdem Alice es getan hat, aber bevor sie es getan hat.
    Die Transaktion von

    Bob wartet, da Alice die Zeilen mit Version = 'v1'

    gesperrt hat
    • Alice bestätigt ihre Transaktion

    • Die Transaktion
    • Bob schlägt mit Cannot serialize access

    • fehl

Um dies zu umgehen, setzen Sie TRANSACTION ISOLATION LEVEL auf READ COMMITTED :

%Vor%

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

    
Quassnoi 24.04.2009 13:11
quelle

Tags und Links