sql >> Databasteknik >  >> RDS >> Oracle

Oracle lag mellan commit och select

Som standard bör beteendet du beskrev vara omöjligt - ändringar som görs i en genomförd transaktion blir omedelbart tillgängliga för alla sessioner. Det finns dock undantag:

  1. Använder du något av WRITE-alternativen i kommandot COMMIT? Om du inte är det, bekräfta värdet på din COMMIT_WRITE-initieringsparameter. Om någon av dem använder "WRITE BATCH" eller speciellt "WRITE BATCH NUWAIT", kan du öppna upp för samtidiga problem. "WRITE BATCH NOWAIT" skulle vanligtvis användas i fall där hastigheten på dina skrivtransaktioner är av större betydelse än eventuella samtidighetsproblem. Om din initialiseringsparameter använder "WRITE"-varianterna kan du åsidosätta den på transaktionsbasis genom att ange IMMEDIATE-satsen i dina commits (se COMMIT)

  2. Anropar transaktionen som försöker läsa data SET TRANSACTION innan den andra transaktionen genomförs? Om du använder SET TRANSACTION för att specificera SERIALISERINGSNIVÅ LÄS ENDAST eller SERIALISERBAR kommer att resultera i att transaktionen inte ser några ändringar som inträffar från andra engagerade sessioner som inträffade efter anropandet av SET TRANSACTION (se SET TRANSACTION)

edit:Jag ser att du använder en DataSource-klass. Jag är inte bekant med den här klassen - jag antar att det är en resurs för anslutningsdelning. Jag inser att din nuvarande appdesign kanske inte gör det lätt att använda samma anslutningsobjekt genom hela ditt arbetsflöde (stegen kan utformas för att fungera oberoende, och du byggde inte in en anläggning för att skicka ett anslutningsobjekt från ett steg till nästa), men du bör verifiera att anslutningsobjekt som returneras till DataSource-objektet är "rena", särskilt med avseende på öppna transaktioner. Det kan vara möjligt att du inte anropar SET TRANSACTION i din kod, men en annan konsument av DataSource kan göra det på annat håll och återföra anslutningen tillbaka till datakällan med sessionen fortfarande i SERIALIZABLE eller READ ONLY-läge. Vid anslutningsdelning är det absolut nödvändigt att alla anslutningar återställs innan de lämnas över till en ny konsument.

Om du inte har någon kontroll eller synlighet över beteendet hos DataSource-klassen, kanske du vill prova att köra en ROLLBACK på den nyligen förvärvade anslutningen för att säkerställa att den inte har någon kvardröjande transaktion redan etablerad.



  1. Arbeta med JavaFX Chart APIs

  2. Prestandaproblem med SQL Server 2012 Enterprise Edition under CAL-licensiering

  3. Hitta det minsta oanvända numret i SQL Server

  4. Hur man skapar en sekvens i MySQL