簡體   English   中英

檢測到死鎖時,Hibernate會話不同步

[英]Hibernate session not synchronize when deadlock detected

我有以下情況來保存我的對象

// Started transaction
User objUser = getUser("123");// get user from DB
objUser.set(...)
.
.
UserAddress objUserAddress = objUser.getUserAddress();
objUserAddress.set(..);
.
.
hibernateSession.flush(); //#Line 1
hibernateSession.saveOrUpdate(objUserAddress); //#Line 2
hibernateSession.flush(); //#Line 3
hibernateSession.saveOrUpdate(objUser); //#Line 4
// Commit transaction

這是User和Address類之間的休眠映射

<class name="com.service.core.bo.impl.User" table="USERS">
.
.
<many-to-one name="userAddress" class="com.service.core.bo.impl.UserAddress"
        column="ADDRESS_ID" not-null="false" unique="true" cascade="save-update"
        lazy="false" />
.
.
</class>

有時我在#Line 1上收到死鎖。這是異常堆棧。

[2017-12-12 11:15:02.131 GMT] WARN [] [] [] [] [] [] [] [] [] http-bio-8280-exec-14 org.hibernate.util.JDBCExceptionReporter - SQL Error: 60, SQLState: 61000
[2017-12-12 11:15:02.131 GMT] ERROR [] [] [] [] [] [] [] [] [] http-bio-8280-exec-14 org.hibernate.util.JDBCExceptionReporter - ORA-00060: deadlock detected while waiting for resource

[2017-12-12 11:15:02.131 GMT] ERROR [] [] [] [] [] [] [] [] [] http-bio-8280-exec-14 org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session
org.hibernate.exception.LockAcquisitionException: Could not execute JDBC batch update
        at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:87)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
        at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:172)
        at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
        at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
        at sun.reflect.GeneratedMethodAccessor706.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
       .
       .
Caused by: java.sql.BatchUpdateException: ORA-00060: deadlock detected while waiting for resource
        at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:12296)
        at oracle.jdbc.driver.OracleStatementWrapper.executeBatch(OracleStatementWrapper.java:246)
        at sun.reflect.GeneratedMethodAccessor553.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at oracle.ucp.jdbc.proxy.StatementProxyFactory.invoke(StatementProxyFactory.java:353)
        at oracle.ucp.jdbc.proxy.PreparedStatementProxyFactory.invoke(PreparedStatementProxyFactory.java:178)
        at com.sun.proxy.$Proxy66.executeBatch(Unknown Source)
        at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
        at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
        ... 71 more

問題是,此錯誤不一致。 在一天和另一天中,這可能發生一次或多次,什么也沒有發生。 不確定為什么flush()導致Could not synchronize database state with sessionORA-00060: deadlock detected while waiting for resource 我發現某些鏈接,例如“ 無法將數據庫狀態與會話的會話狀態同步”,但我的實際原因是上述異常導致的死鎖。

無法將數據庫狀態與會話同步是一個常見的休眠錯誤,可能有多個根本原因。 您應該關注的錯誤是:

ORA-00060:等待資源時檢測到死鎖

這是特定於Oracle的,並且發生在從一個以上的連接進行同一數據(數據庫中的行)的更新時。 每當Oracle(實際上是幾乎所有數據庫)都更新行時,它將在更新期間將其鎖定。 如果在鎖定時嘗試在同一行上進行其他更新,則會發生此錯誤。 這是Oracle的官方錯誤說明:

ORA-00060:等待資源時檢測到死鎖

原因:事務在等待資源時彼此陷入僵局。

操作:查看跟蹤文件以查看所涉及的事務和資源。 如有必要,請重試。

解決此問題的一種方法是使用版本控制:

https://www.intertech.com/Blog/versioning-optimistic-locking-in-hibernate/

這會將版本列添加到表中,該行在更新時會自動增加。 在檢查更新版本之前,如果版本高於預期版本,則甚至不會更新該更新,並且會拋出特定錯誤,您可以處理。 通常,處理涉及從該實體的數據庫中重新加載信息,將其值重置為所需的值,然后保存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM