Som standard burde den adfærd, du beskrev, være umulig - ændringer foretaget i en forpligtet transaktion bliver straks tilgængelige for alle sessioner. Der er dog undtagelser:
-
Bruger du nogen af WRITE-mulighederne i COMMIT-kommandoen? Hvis du ikke er det, skal du bekræfte værdien af din COMMIT_WRITE initialiseringsparameter. Hvis enten bruger "WRITE BATCH" eller især "WRITE BATCH NUWAIT", kan du åbne dig selv op for samtidighedsproblemer. "WRITE BATCH NOWAIT" vil typisk blive brugt i tilfælde, hvor hastigheden af dine skrivetransaktioner er af større betydning end mulige samtidighedsproblemer. Hvis din initialiseringsparameter bruger "WRITE"-varianterne, kan du tilsidesætte den på transaktionsbasis ved at angive IMMEDIATE-sætningen i dine commits (se COMMIT)
-
Er transaktionen, der forsøger at læse dataene, der påberåber sig SET TRANSACTION før den anden transaktion begår? Brug af SET TRANSACTION til at specificere SERIALISERINGSNIVEAU LÆSEKUN eller SERIALISERbar vil resultere i, at transaktionen ikke ser nogen ændringer, der sker fra andre forpligtede sessioner, der fandt sted efter påkaldelsen af SET TRANSACTION (se SET TRANSACTION)
edit:Jeg kan se, at du bruger en DataSource-klasse. Jeg er ikke bekendt med denne klasse - jeg antager, at det er en forbindelsesdelingsressource. Jeg er klar over, at dit nuværende app-design måske ikke gør det nemt at bruge det samme forbindelsesobjekt gennem hele dit arbejdsflow (trinene kan være designet til at fungere uafhængigt, og du har ikke indbygget en facilitet til at overføre et forbindelsesobjekt fra et trin til næste), men du bør kontrollere, at forbindelsesobjekter, der returneres til DataSource-objektet, er "rene", især med hensyn til åbne transaktioner. Det kan være muligt, at du ikke påberåber SET TRANSACTION i din kode, men en anden forbruger af DataSource gør det muligvis og returnerer forbindelsen tilbage til datakilden med sessionen stadig i SERIALIZABLE eller READ ONLY-tilstand. Ved deling af forbindelse er det bydende nødvendigt, at alle forbindelser rulles tilbage, før de videregives til en ny forbruger.
Hvis du ikke har nogen kontrol over eller overblik over DataSource-klassens adfærd, kan du prøve at udføre en ROLLBACK på den nyligt erhvervede forbindelse for at sikre, at der ikke allerede er etableret en langvarig transaktion.