Search the FirstSpirit Knowledge Base
Hallo,
ich bekomme vermehrt beim Freigeben von Datensätzen (FS5) die folgende Fehlermeldung.
Jemand eine Idee?
Hört sich nach einem grundsätzlichen Problem an?
Caused by: java.sql.SQLException: ORA-08177: Zugriff für diese Transaktion kann nicht serialisiert werden
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:439)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:395)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:802)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:436)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:521)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:205)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:861)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1145)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1267)
at oracle.jdbc.driver.OracleStatement.doScrollExecuteCommon(OracleStatement.java:4735)
at oracle.jdbc.driver.OraclePreparedStatement.doScrollPstmtExecuteUpdate(OraclePreparedStatement.java:10184)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3447)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3493)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1491)
at de.espirit.or.impl.TemporalCommandHandler.getLastReleasedEntry(TemporalCommandHandler.java:668)
at de.espirit.or.impl.TemporalCommandHandler.handle(TemporalCommandHandler.java:266)
at de.espirit.or.impl.ReleaseCommand.accept(ReleaseCommand.java:42)
at de.espirit.or.impl.AbstractSessionHandler.commit(AbstractSessionHandler.java:797)
at de.espirit.or.impl.AbstractSessionHandler.commit(AbstractSessionHandler.java:76)
at de.espirit.firstspirit.content.ContentManagerImpl$TemporalSessionHandler.commit(ContentManagerImpl.java:1296)
at de.espirit.firstspirit.content.ContentManagerImpl.commit(ContentManagerImpl.java:688)
at sun.reflect.GeneratedMethodAccessor6175.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at de.espirit.firstspirit.io.DefaultServerHandler.callManager(DefaultServerHandler.java:62)
at de.espirit.firstspirit.server.io.handler.ManagerCall.doCall(ManagerCall.java:95)
at de.espirit.firstspirit.server.io.handler.CompactCall.handle(CompactCall.java:68)
at de.espirit.firstspirit.server.io.ManagerCallWorker.run(ManagerCallWorker.java:108)
at de.espirit.firstspirit.server.ExecutionManagerImpl$RunnableWrapper.call(ExecutionManagerImpl.java:578)
at de.espirit.firstspirit.server.ExecutionManagerImpl$ExtendedCallable.call(ExecutionManagerImpl.java:545)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at de.espirit.common.util.BoundedExecutorService$RunnableWrapper.run(BoundedExecutorService.java:419)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at de.espirit.firstspirit.client.io.ServerCaller.callManager(ServerCaller.java:372)
at de.espirit.firstspirit.io.DefaultClientHandler.callManager(DefaultClientHandler.java:55)
at de.espirit.firstspirit.client.io.RemoteManagerCaller.invoke(RemoteManagerCaller.java:52)
at de.espirit.firstspirit.server.$Proxy36.commit(Unknown Source)
at de.espirit.firstspirit.store.access.templatestore.SessionHandlerImpl.commit(SessionHandlerImpl.java:129)
at de.espirit.or.impl.SessionImpl.doCommit(SessionImpl.java:215)
at de.espirit.or.impl.AbstractSession.commit(AbstractSession.java:589)
at de.espirit.firstspirit.client.gui.tree.store.contentstore.GuiContent$4$1.run(GuiContent.java:567)
der fix ist hier in der Layer/jdbc Konfiguration: "jdbc.isolation=READ_COMMITTED" zu setzen. das bezieht sich nur auf oracle.
Set transaction isolation mode to TRANSACTION_READ_COMMITTED and see
ORA-08177 no more. See last paragraph of this posting for how. If you
use no entity beans (ie. direct JDBC from a session bean) and / or run
in a clustered multi-app-server shared-database env, you might want to
look closer though:
ORA-08177 is only possible in TRANSACTION_SERIALIZABLE (WLS default) tx
isolation mode. Are you sure that you need this (strictest) level of
transaction isolation ? Do you genuinely have multiple transactions
updating and reading the same data ? Even so,
TRANSACTION_READ_COMMITTED is often quite sufficient, provides better
concurrency, is almost as strict (no dirty reads of uncommitted data),
and I recall it to be an Oracle default.
This said, TRANSACTION_SERIALIZABLE is necessary in cases where you
really need to prevent chronologically overlapping transactions from
seeing each other's committed modifications or record additions
("non-repeatable reads/phantom inserts" as laid out by ISO SQL92).
But for instance, in a simple case of EJB1.1 entity bean single-server
configuration TRANSACTION_SERIALIZABLE and ORA-08177 would most of the
time be an unnecessary nuisance, because by EJB1.1 definition the
container locks access to entity instances exclusively by one
transaction at a time. Thus inconsistent reads would seem impossible
there, because a single (ie. the same) entity instance would be used for
the immediately consecutive reads in any case. (gurus, make my day.
Rather, please correct me if I'm all wrong, since I do want to
understand this problem correctly
IMHO, WLS 5.1 .. WLS 7.0 documentation could provide a little more
verbose understanding of the RDBMS tx isolation modes in the J2EE
context and mention READ_COMMITTED for Oracle (with its restrictions for
databases shared in a cluster, perhaps), or provide pointers to
3rd-party documentation, because this still seems to be a frequent
headache for developers. A FAQ-candidate perhaps ? I found this link
helpful (you need Oracle technet access):
Hallo David,
benötigst du noch weitere Hilfe oder hat Andrés Antwort zur Lösung des Problems geführt? In diesem Fall wäre es super, wenn du seine Antwort als "richtige Antwort" markierst.
Viele Grüße
Michaela
Wir sind noch dran das Problem nachzustellen und zu beheben. Den Fix haben wir bereits auf unserem Testsystem installiert. Soabld wir das System erfogreich getestet haben, markiere ich die Antwort auch als Richtig.