1. 程式人生 > >hibernate的事務處理機制以及flush方法的作用

hibernate的事務處理機制以及flush方法的作用

關於在使用hibernate在提交事務時常遇到的異常:

       an assertion failure occured (this may indicate a bug in Hibernate, butis more likely due to unsafe use of the session)
net.sf.hibernate.AssertionFailure: possiblenonthreadsafe access to session

其實這個異常一般都是和我們在操作session flush方法和提交事務過程中會丟擲的,下面就具體結合session的事務和宣告週期來具體分析下,為什麼會有這樣的異常;

首先來看下,session的生命週期

Hibernatejava物件的三種狀態:

1臨時狀態(transient):用new語句建立,還沒有被持久化,不處於Session的快取中。

2、持久化狀態(persistent):已使用save()或者saveOrUpdate()方法,處於Session的快取中和資料庫表中,生成了自己的Oid標識。

3、遊離狀態(detached):被持久化,已使用evict(Object)session.close()或者使用clear()清除快取,不再處於Session的快取中或不存在資料庫表中,但是依然是存在自己的OId標識。

物件的狀態轉換

                                                     

從上面的圖中我們可以很清楚的明白一個java物件在session中三種狀態的轉換,

然後在來看看session快取在什麼時候會被清除:

1.當應用程式呼叫org.hibernate.Transactioncommit()方法的時候,commit()方法先清理快取,然後再向資料庫提交事務。

2.當應用程式顯式呼叫Sessionflush()方法的時候,其實這個方法我們幾乎很少用到,因為我們一般都是在完成一個事務才去清理快取,提交資料更改,這樣我們直接提交事務就可以。

clear()evict(Object)的區別:

從引數就可以看出,clear()是會清除整個session中的快取,evict(Object)

是將一個物件從session快取中清除;

其實在session持久化操作和資料庫中之間還有一層物件緩衝區(entityEntries

   

Commit():此方法在執行後會更新物件在物件快取區中的existsInDatabase=true;

Flush():會按save,update,delete順序執行,把快取中的資料flush入資料庫中,並清空快取區;

下面幾個例子可以充分說明我們異常丟擲的情況:

SessionFactory sf = newConfiguration().configure().buildSessionFactory() ;
Session s = sf.openSession();
Person person = new Person();

Transaction tran =s.beginTransaction(); (1)
s.save(person); (2)(此處同樣可以為updatedelete)
s.evict(person); (3)
tran.commit(); (4)
s.close();(5)

看上面的程式碼,再參照下我們的示例圖和commit()方法,就可以很明顯的發現程式碼問題的所在,在第四步evict()方法將cat物件從物件快取區清除,當我們執行commit()方法後,更新物件在快取區中狀態的時候,由於已被清除,就會出現上述斷言的異常;

Person person1 = new Person();
person1.setName(“tom”);
s.save(person1);

person1.setName(“mary”);
s.update(person1);

Person person2 = new Person();
person2.setName(“tom”);
s.save(person2);

s.flush();

其實在這裡我們看這個程式碼的時候感覺是沒問題 ,在這裡我們可以參考下剛提到的flush()方法,此方法會按save,update,delete的順序進行提交事務,所以在這裡會丟擲主鍵衝突的異常,解決的辦法是在update()操作後面也加入flush();

總的來說,由於flush()的特殊處理機制,雖然不建議使用此方法,但是在一些複雜的事務處理過程中,加入此方法雖然會破壞事務的一個提交的完整性,但是可以規避一些不可預見的異常情況!

相關推薦

hibernate事務處理機制以及flush方法作用

關於在使用hibernate在提交事務時常遇到的異常:        an assertion failure occured (this may indicate a bug in Hibernate, butis more likely due to unsafe us

Hibernate事務處理機制flush方法的用法

注:轉自http://www.cnblogs.com/wangkai1990/p/5704529.html。 首先來看下,session的生命週期 Hibernate中java物件的三種狀態: 1、臨時狀態(transient):用new語句建立,還沒有被持久化,不處於Se

open session and Hibernate事務處理機制

在沒有使用Spring提供的Open Session In View情況下,因需要在service(or Dao)層裡把session關閉,所以lazy loading 為true的話,要在應用層內把關係集合都初始化,如 company.getEmployees(),否則Hi

Android開發中的SQLite事務處理,即beginTransaction()方法

使用SQLiteDatabase的beginTransaction()方法可以開啟一個事務,程式執行到endTransaction() 方法時會檢查事務的標誌是否為成功,如果程式執行到endTransaction()之前呼叫了setTransactionSuccessful() 

Hibernate批量處理海量資料的方法(轉)

本文例項講述了Hibernate批量處理海量資料的方法。分享給大家供大家參考,具體如下: Hibernate批量處理海量其實從效能上考慮,它是很不可取的,浪費了很大的記憶體。從它的機制上講,Hibernate它是先把符合條件的資料查出來,放到記憶體當中,然後再進行操作。實際

Hibernate事務處理

事務:  事務通俗說就是邏輯上的一組操作,要麼全都成功,要麼全都失敗!!!   事務有四個特性,簡稱為ACID: 原子性(Atomicity):事務一組操作不可分割. 一致性(Consistency):事務的執行前後,資料完整性要保持一致. 隔離性(Isolatio

Android Handler 機制以及方法所線上程原理分析

Handler 的定義及作用: 因為有的文章已經說得比較清楚了,就直接引用下。這裡借鑑http://mobile.51cto.com/aprogram-442833.htm 一、Handler的定義: 主要接受子執行緒傳送的資料, 並用此資料配合主執行緒更新UI。

rocketmq介紹和訊息佇列事務處理機制

RocketMQ介紹 rocketmq是支援釋出(Pub)和訂閱(Sub),可靠的先進先出、嚴格順序、億級訊息堆積能力的分散式訊息佇列 rocketmq訊息佇列包含Producer、Name Serv

spring管理的hibernate事務不會自動flush的問題-今天真遇到這問題了

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">  <property name="sessionFactory" ref="sessi

Spring事務處理機制

常用的事務處理方式:   手動處理事務   註解式事務   AOP宣告事務資料庫訪問時,就不需要開啟Session、開啟事務,提交事務、關閉 Session。由AOP指定的事務管理器,在方法(資料庫訪

Spring多資料來源事務處理機制

最近有spring配置多資料來源,中間用了aop來完成動態的切換,發現一些地方不是很明白,在AbstractRoutingDataSource這個類中有determineCurrentLookupKey的方法,另外我在所有DAO層方法上添加了before的切面,按理說,如果

分散式系統常見的事務處理機制

為保障系統的可用性、可靠性以及效能,在分散式系統中,往往會設定資料冗餘,即對資料進行復制。舉例來說,當一個數據庫的副本被破環以後,那麼系統只需要轉換到其他資料副本就能繼續執行下去。另外一個例子,當訪問單一伺服器管理的資料的程序數不斷增加時,系統就需要對伺服器

Hibernate 事務處理和spring中配置事務

原文連結:http://blog.csdn.net/sd0902/article/details/8393700 1.非整合spring事務管理 事務是指由一個或者多個SQL語句組成的工作單元,這個單元中SQL語句只要有一個SQL語句執行失敗,就會撤銷整個工作單元

SpringBoot之錯誤處理機制以及定製錯誤資訊

一、SpringBoot預設的錯誤處理機制 預設效果: 1)、瀏覽器,返回一個預設的錯誤頁面 瀏覽器傳送請求的請求頭: 2)、如果是其他客戶端,預設響應一個json資料 原理: 可以參照ErrorMvcAutoConfigurat

spring 配置hibernate事務處理

學習Spring+Hibernate,非常強大的框架,為了追新,就直接從最高版本開始學習了,這要冒很大的風險,因為網上可查到的資料大多是針對舊版本的,比如Spring3,Hibernate3。 根據我的測試,記錄如下: 1.Spring4事務必須針對介面,否則報錯。(之前可以不針對介面?)如果沒有事務,則b

原始碼分析 spring事務處理機制

Spring在TransactionDefinition介面中定義這些屬性,以供PlatfromTransactionManager使用, PlatfromTransactionManager是Spring事務管理的核心介面。介面程式碼如下: public interface

Hibernate--事務處理和快取管理

事務處理:    事務是資料庫操作中一個最小的執行單元,它由一組相互依賴的操作行為組成。資料庫事務必須具有ACID特徵,ACID是Atomic(原子性)、Consistency(一致性)、Isolation(隔離性)和Durability(永續性)的英文縮寫。       

分布式系統常見的事務處理機制

分布式計算 返回 系統 zook rollback 個數 自身 重要 數據一致性 為保障系統的可用性、可靠性以及性能,在分布式系統中,往往會設置數據冗余,即對數據進行復制。舉例來說,當一個數據庫的副本被破環以後,那麽系統只需要轉換到其他數據副本就能繼續運行下去。另外一個例子

常見事務併發問題以及處理方法

1、資料庫事務併發會引起那些常見問題以及對應的解決方法? 1)丟失更新:撤消一個事務時,把其它事務已提交的更新的資料覆蓋了。 2)髒讀:一個事務讀到另一個事務未提交的更新資料。 3)幻讀:一個事務執行兩次查詢,但第二次查詢比第一次查詢多出了一些資料行。 4)不可重複讀:一

oracle學習之多表查詢,子查詢以及事務處理

color 1-1 註意事項 員工 列數 .com 外連接 分析 top-n分析 多表查詢的基礎是采用笛卡爾集: 最終的行數 = 表1的行數 * 表2的行數 最終的列數 = 表1的列數 + 表2的列數 過濾笛卡爾集的關鍵是寫連接條件,N張表至少需要N-1個條件。 多表