|
Hi, I am running in a deadlock when 2 transactions are concurrently inserting several objects that involve 2 tables (abstract superclass & concrete subclass): class ActionHistoryEntry extends CaseHistoryEntry. CaseHistoryEntry maps to CASE_LOG, ActionHistoryEntry maps to CASE_LOG_ACTION.
I suspect the problem comes from the successive insert into CASE_LOG,CASE_LOG_ACTION,CASE_LOG,CASE_LOG_ACTION,... in both transactions.
The statement trace I included shows thread 0 inserting 2 ActionHistoryEntry up to 11:15:02,680 followed by thread 3 inserting 2 ActionHistoryEntry up to 11:15:18,461. Then deadlock occurs and thread 0 gets rejected at 11:24:49,075. After that point thread 3 finishes normally.
db usage is typically to do inserts in a global order according to fk dependencies. Here in both transactions I would systematically insert all in CASE_LOG, then all in CASE_LOG_ACTION instead of imbricating statements.
Is there a way to get hibernate to do that, since it knows about fk, it should have all the necessary information...
has anybody had a similar experience?
thanks for help,
v.
Hibernate version: 3.0
Mapping documents: <hibernate-mapping package="ch.tcs.assys.cases.history" default-cascade="all-delete-orphan" default-lazy="false"> <typedef name="version" class="ch.tcs.assys.hibernate.VersionType" /> <typedef name="datetime" class="ch.tcs.assys.hibernate.DatetimeType" />
<class name="CaseHistoryEntry" table="CASE_LOG">
<id name="id" column="CSLO_ID"> <generator class="ch.tcs.assys.hibernate.SequenceIdentifierGenerator" /> </id>
<version name="version" column="CSLO_UPDT_TIMESTAMP" type="version" /> <property name="userInitials" column="CSLO_UPDT_USER" />
<property name="editable" column="CSLO_IS_EDITABLE" /> <property name="important" column="CSLO_IS_IMPORTANT" /> <property name="caseReferenceNb" column="CASE_REFERENCE_NB" /> <property name="type" column="CSLO_TYPE" /> <property name="subject" column="CSLO_SUBJECT_TK" /> <property name="transactionType" column="CSLO_TRNS_TYPE_TK" /> <property name="transactionStatus" column="CSLO_TRNS_STATUS_TK" /> <property name="accountingReferenceNb" column="CSLO_TRNS_ACCOUNT_REF_NB" /> <property name="creationDate" column="CSLO_CREATION_TIMESTAMP" type="datetime" />
<joined-subclass name="ActionHistoryEntry" table="CASE_LOG_ACTION"> <key column="CSLO_ID" />
<property name="actionId" column="ACTI_ID" /> <property name="actionType" column="ACTT_ID" />
<property name="serviceId" column="SRVC_ID" /> <property name="serviceType" column="SRVT_ID" />
<property name="caseStatus" column="CSST_ID" /> <property name="status" column="CSLA_STATUS_TK" /> <property name="phoneNb" column="CSLA_PHONE_NB" /> <property name="minutes" column="CSLA_ADNL_WAITING_TIME" />
</joined-subclass>
</class>
</hibernate-mapping>
Code between sessionFactory.openSession() and session.close():
Full stack trace of any exception that occurs: [ORB.thread.pool : 0] 11:24:49,075 ERROR def.AbstractFlushingEventListener - Could not synchronize database state with session org.hibernate.exception.GenericJDBCException: could not insert: [ch.tcs.assys.cases.history.ActionHistoryEntry] at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:82) at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:70) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:1869) at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:2200) at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:46) at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:239) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:223) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:136) at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:274) at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27) at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:730) at ch.tcs.assys.cases.wrapper.ejb.CaseWrapperImpl.create(Unknown Source) at ch.tcs.assys.cases.model.helper.CaseModelHelper.confirm(Unknown Source) at ch.tcs.assys.cases.ejb.CaseFacadeBeanImpl.confirm(Unknown Source) at ch.tcs.assys.cases.ejb.CaseFacadeBeanImpl$$EnhancerByCGLIB$$cd288036_2.CGLIB$confirm$0(<generated>) at ch.tcs.assys.cases.ejb.CaseFacadeBeanImpl$$EnhancerByCGLIB$$cd288036_2$$FastClassByCGLIB$$caef933f.invoke(<generated>) at net.sf.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:167) at ch.tcs.framework.ejb.FacadeInterceptor.intercept(Unknown Source) at ch.tcs.assys.cases.ejb.CaseFacadeBeanImpl$$EnhancerByCGLIB$$cd288036_2.confirm(<generated>) at ch.tcs.assys.cases.ejb.CaseFacadeBean.confirm(Unknown Source) at ch.tcs.assys.cases.ejb.EJSRemoteStatelessCaseFacade_5b30594b.confirm(Unknown Source) at ch.tcs.assys.cases.ejb._EJSRemoteStatelessCaseFacade_5b30594b_Tie.confirm(_EJSRemoteStatelessCaseFacade_5b30594b_Tie.java:349) at ch.tcs.assys.cases.ejb._EJSRemoteStatelessCaseFacade_5b30594b_Tie._invoke(_EJSRemoteStatelessCaseFacade_5b30594b_Tie.java:104) at com.ibm.CORBA.iiop.ServerDelegate.dispatchInvokeHandler(ServerDelegate.java:608) at com.ibm.CORBA.iiop.ServerDelegate.dispatch(ServerDelegate.java:461) at com.ibm.rmi.iiop.ORB.process(ORB.java:436) at com.ibm.CORBA.iiop.ORB.process(ORB.java:1728) at com.ibm.rmi.iiop.Connection.doWork(Connection.java:2230) at com.ibm.rmi.iiop.WorkUnitImpl.doWork(WorkUnitImpl.java:65) at com.ibm.ejs.oa.pool.PooledThread.run(ThreadPool.java:95) at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:912) Caused by: COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI Driver][DB2/LINUX] SQL0913N Unsuccessful execution caused by deadlock or timeout. Reason code "2". SQLSTATE=57033
at COM.ibm.db2.jdbc.app.SQLExceptionGenerator.throw_SQLException(Unknown Source) at COM.ibm.db2.jdbc.app.SQLExceptionGenerator.throw_SQLException(Unknown Source) at COM.ibm.db2.jdbc.app.SQLExceptionGenerator.check_return_code(Unknown Source) at COM.ibm.db2.jdbc.app.DB2PreparedStatement.execute2(Unknown Source) at COM.ibm.db2.jdbc.app.DB2PreparedStatement.executeUpdate(Unknown Source) at com.ibm.ws.rsadapter.jdbc.WSJdbcPreparedStatement.pmiExecuteUpdate(WSJdbcPreparedStatement.java:664) at com.ibm.ws.rsadapter.jdbc.WSJdbcPreparedStatement.executeUpdate(WSJdbcPreparedStatement.java:483) at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:1856) ... 28 more
Name and version of the database you are using: db2 on linux
The generated SQL (show_sql=true): [ORB.thread.pool : 0] 11:15:02,680 DEBUG hibernate.SQL - insert into CASE_LOG (CSLO_UPDT_TIMESTAMP, CSLO_UPDT_USER, CSLO_IS_EDITABLE, CSLO_IS_IMPORTANT, CASE_REFERENCE_NB, CSLO_TYPE, CSLO_SUBJECT_TK, CSLO_TRNS_TYPE_TK, CSLO_TRNS_STATUS_TK, CSLO_TRNS_ACCOUNT_REF_NB, CSLO_CREATION_TIMESTA MP, CSLO_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [ORB.thread.pool : 0] 11:15:02,680 DEBUG hibernate.SQL - insert into CASE_LOG_ACTION (ACTI_ID, ACTT_ID, SRVC_ID, SRVT_ID, CSST_ID, CSLA_STATUS_TK, CSLA_PHONE_NB, CSLA_ADNL_WAITING_TIME, CSLO_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?) [ORB.thread.pool : 3] 11:15:17,852 DEBUG hibernate.SQL - insert into ACCOUNT_DETAIL (CTRY_CODE, ACDT_SUPPLIER_REFERENCE, ACDT_CLIENT_REFERENCE, ACDT_PAYMENT_MODE_TK, ACDT_ACCOUNT_NB, ACDT_BANK_CODE, ACDT_BANK_REFERENCE, ACDT_IBAN_CODE, ACDT_RIB_NB, ACDT_IS_SUBJECT_TO_VAT, ACDT_COUNTRY_G ROUP, ACDT_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [ORB.thread.pool : 3] 11:15:17,883 DEBUG hibernate.SQL - insert into CONTACT_ADDRESS (CONT_UPDT_TIMESTAMP, CONT_UPDT_USER, CONT_IS_DELETED, DCLG_CODE, CONT_LOCATION_TYPE, CONT_CONTACT_TYPE_TK, CONT_CONTACT_FNAME, CONT_CONTACT_NAME, CONT_CONTACT_BIRTHDAY, CONT_EMAIL, CONT_COMMENT, CONT_I S_POI_CANDIDATE, CASE_REFERENCE_NB, REGI_ID, CONT_PHONE1, CONT_PHONE2, CONT_PHONE_MOBILE1, CONT_PHONE_MOBILE2, CONT_FAX1, CONT_FAX2, HNOD_ID, HDIR_ID, HWAY_ID, HSEG_ID, CONT_COORD_X, CONT_COORD_Y, CONT_CONTACT_TITLE_TK, ADDR_ID, POFI_ID, ACDT_ID, ALIA_ID, CTRY_CODE, LOCL_ID, CONT_LOCALITY, PCOD_POST CODE, CONT_POSTCODE, CONT_STREET_NAME, CONT_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [ORB.thread.pool : 3] 11:15:17,930 DEBUG hibernate.SQL - insert into CLIENT (CLIE_UPDT_TIMESTAMP, CLIE_UPDT_USER, CLIE_PERSONAL_REFERENCE, CLIE_IS_EMPLOYEE, CONT_ID, CLIE_ID) values (?, ?, ?, ?, ?, ?) [ORB.thread.pool : 3] 11:15:17,961 DEBUG hibernate.SQL - insert into ADDRESS (ADDR_IS_DELETED, ADDR_TYPE, ADDR_COORD_X, ADDR_COORD_Y, STRT_ID, ADDR_STREET_NAME, ADDR_HOUSE_NB, LOCL_ID, ADDR_LOCALITY, CTRY_CODE, ADDR_HOUSE_DESCRIPTION, PCOD_POSTCODE, ADDR_POSTCODE, STAT_CODE, ADDR_STATE, ADDR_SITUATION, ADDR_PO_BOX, ADDR_IS_OADR_CANDIDATE, ADDR_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [ORB.thread.pool : 3] 11:15:17,977 DEBUG hibernate.SQL - insert into ACCOUNT_DETAIL (CTRY_CODE, ACDT_SUPPLIER_REFERENCE, ACDT_CLIENT_REFERENCE, ACDT_PAYMENT_MODE_TK, ACDT_ACCOUNT_NB, ACDT_BANK_CODE, ACDT_BANK_REFERENCE, ACDT_IBAN_CODE, ACDT_RIB_NB, ACDT_IS_SUBJECT_TO_VAT, ACDT_COUNTRY_G ROUP, ACDT_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [ORB.thread.pool : 3] 11:15:18,008 DEBUG hibernate.SQL - insert into CONTACT_ADDRESS (CONT_UPDT_TIMESTAMP, CONT_UPDT_USER, CONT_IS_DELETED, DCLG_CODE, CONT_LOCATION_TYPE, CONT_CONTACT_TYPE_TK, CONT_CONTACT_FNAME, CONT_CONTACT_NAME, CONT_CONTACT_BIRTHDAY, CONT_EMAIL, CONT_COMMENT, CONT_I S_POI_CANDIDATE, CASE_REFERENCE_NB, REGI_ID, CONT_PHONE1, CONT_PHONE2, CONT_PHONE_MOBILE1, CONT_PHONE_MOBILE2, CONT_FAX1, CONT_FAX2, HNOD_ID, HDIR_ID, HWAY_ID, HSEG_ID, CONT_COORD_X, CONT_COORD_Y, CONT_CONTACT_TITLE_TK, ADDR_ID, POFI_ID, ACDT_ID, ALIA_ID, CTRY_CODE, LOCL_ID, CONT_LOCALITY, PCOD_POST CODE, CONT_POSTCODE, CONT_STREET_NAME, CONT_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [ORB.thread.pool : 3] 11:15:18,071 DEBUG hibernate.SQL - insert into INCIDENT (INCD_UPDT_TIMESTAMP, INCD_UPDT_USER, CAUS_ID_PRIMARY, INCD_DATETIME, INCD_COMMENT, CONT_ID, INCD_ID) values (?, ?, ?, ?, ?, ?, ?) [ORB.thread.pool : 3] 11:15:18,102 DEBUG hibernate.SQL - insert into CALLER (CLLR_UPDT_TIMESTAMP, CLLR_UPDT_USER, CLLR_GENDER_TK, CLLR_NAME, CLLR_FNAME, CLLR_PHONE1, CLLR_PHONE2, CLLR_PHONE3, CLLR_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?) [ORB.thread.pool : 3] 11:15:18,117 DEBUG hibernate.SQL - insert into CALL (CALL_UPDT_TIMESTAMP, CALL_UPDT_USER, CALL_CALLED_NB, CALL_DATE, CALL_POLLUTED_CLIENT_REFERENCE, CALL_COMMENT, CALL_REASON_TK, CALL_CLI, CALL_POLLUTED_LICENSE_PLATE, CALL_POLLUTED_PLATE_CTRY_CODE, CLLR_ID, CALL_ID ) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [ORB.thread.pool : 3] 11:15:18,149 DEBUG hibernate.SQL - insert into CASE (CASE_UPDT_TIMESTAMP, CASE_UPDT_USER, CALC_ID, SECT_ID, SSCT_ID, CASE_PRIORITY_TK, CASE_ESTIMATED_WAITING_TIME, CASE_WAITING_TIME_EXTENSION, CASE_IS_CLIENT_CALLBACK, CASE_IS_PHYSICAL_AVAILABLE, CASE_EXPECTED_ON_SI TE_DATETIME, CASE_BREAKDOWN_END_DATETIME, CASE_IS_HANDLED_BY_HELPDESK, CASE_IS_HANDLED_BY_BACKOFFICE, EMPL_ID_MANAGER, EMPL_ID_TRAINEE, CASE_ATTRIBUTION_DATETIME, CASE_TIMER_TRIGGER_DATETIME, CASE_TIMER_TYPE, CSST_ID, clie_id, incd_id, call_id, CASE_REFERENCE_NB) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ? , ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [ORB.thread.pool : 3] 11:15:18,211 DEBUG hibernate.SQL - insert into VEHICLE (VHCL_UPDT_TIMESTAMP, VHCL_UPDT_USER, CASE_REFERENCE_NB, VHCL_GEAR_TYPE_TK, VHCL_CHASSIS_NB, VHCL_OSM_NB, VHCL_TYPE_TK, VHCL_HAS_ROOF_RACK, VHCL_HAS_CYCLE_RACK, VHCL_IS_LOWERED, VHCL_IS_STEERING_DAMAGED, VHCL_I S_NOT_STARTABLE, VHCL_IS_NOT_MOVABLE, VHCL_BREAKDOWN_TYPE_TK, VHCL_CIRCULATION_START_DATE, VHCL_RESPONSIBILITY_TK, VHCL_COMMENT, VHCL_MISSING_WHEELS_TK, VHCL_ODOMETER, ICOE_ID, VHCL_COLOR_TK, VHCL_COLOR_NAME, VHCL_CTRY_CODE, VHCL_LICENSE_PLATE, VHCL_DOCUMENT_PLACE_TK, VHCL_DOCUMENT_PLACE_NAME, VHCL_ KEY_PLACE_TK, VHCL_KEY_PLACE_NAME, VHCL_LICENSE_PLATE_PLACE_TK, VHCL_LICENSE_PLATE_PLACE_NAME, CMAN_ID, VHCL_MANUFACTURER_NAME, CMOD_ID, VHCL_WEIGHT, VHCL_HEIGHT, VHCL_WIDTH, VHCL_MODEL_NAME, VHCL_LENGTH, CONT_ID, VHCL_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [ORB.thread.pool : 3] 11:15:18,274 DEBUG hibernate.SQL - insert into CASE_COVERAGE (CASE_REFERENCE_NB, PROD_ID, CCVG_PAYMENT_DATE, CCVG_START_DATE, CCVG_END_DATE, CCVG_SUSPENSION_DATE, CCVG_CANCELLATION_DATE, CCVG_IS_COVERED, CCVG_COMMENT, CCVG_CHASSIS_NB, CCVG_ASSISTANCE_AMOUNT, CCVG_C LIENT_NB, CTRY_CODE, CCVG_LICENSE_PLATE, CCVG_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [ORB.thread.pool : 3] 11:15:18,321 DEBUG hibernate.SQL - insert into CASE_LOG (CSLO_UPDT_TIMESTAMP, CSLO_UPDT_USER, CSLO_IS_EDITABLE, CSLO_IS_IMPORTANT, CASE_REFERENCE_NB, CSLO_TYPE, CSLO_SUBJECT_TK, CSLO_TRNS_TYPE_TK, CSLO_TRNS_STATUS_TK, CSLO_TRNS_ACCOUNT_REF_NB, CSLO_CREATION_TIMESTA MP, CSLO_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [ORB.thread.pool : 3] 11:15:18,336 DEBUG hibernate.SQL - insert into CASE_LOG_ACTION (ACTI_ID, ACTT_ID, SRVC_ID, SRVT_ID, CSST_ID, CSLA_STATUS_TK, CSLA_PHONE_NB, CSLA_ADNL_WAITING_TIME, CSLO_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?) [ORB.thread.pool : 3] 11:15:18,399 DEBUG hibernate.SQL - insert into ACTION (ACTI_UPDT_TIMESTAMP, ACTI_UPDT_USER, ACTI_IS_DELETED, CASE_REFERENCE_NB, ACTI_CREATION_DATETIME, ACTI_PLANNED_DATETIME, ACTI_CLOSURE_DATETIME, ACTI_COMMENT, ACTI_IS_ACKNOWLEDGED, ACTI_IS_DEFAULT, ACTI_IS_TCS_TO _ORGANIZE, SRVC_ID, ACTT_ID, ACTI_STATUS_TK, EMPL_ID, CALC_ID, ROLE_ID, ACTI_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [ORB.thread.pool : 3] 11:15:18,430 DEBUG hibernate.SQL - insert into CASE_LOG (CSLO_UPDT_TIMESTAMP, CSLO_UPDT_USER, CSLO_IS_EDITABLE, CSLO_IS_IMPORTANT, CASE_REFERENCE_NB, CSLO_TYPE, CSLO_SUBJECT_TK, CSLO_TRNS_TYPE_TK, CSLO_TRNS_STATUS_TK, CSLO_TRNS_ACCOUNT_REF_NB, CSLO_CREATION_TIMESTA MP, CSLO_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [ORB.thread.pool : 3] 11:15:18,461 DEBUG hibernate.SQL - insert into CASE_LOG_ACTION (ACTI_ID, ACTT_ID, SRVC_ID, SRVT_ID, CSST_ID, CSLA_STATUS_TK, CSLA_PHONE_NB, CSLA_ADNL_WAITING_TIME, CSLO_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?)
Debug level Hibernate log excerpt: log4j.logger.org.hibernate.SQL=DEBUG
|