事務(wù)處理:
Hibernate本身并不具備事務(wù)管理能力。在事務(wù)管理層,Hibernate將其委托給底層的JDBC或者JTA,以實(shí)現(xiàn)事務(wù)的管理與調(diào)度。
基于JDBC的事務(wù):
無疑是最簡(jiǎn)單的實(shí)現(xiàn)方式,
session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
tx.commit();
基于JTA的事務(wù)管理:
hibernate默認(rèn)采用JDBC Transacion。可以通過配置文件指定采用JTA作為事務(wù)管理實(shí)現(xiàn)。
<hibernate-configuration>
??? <session-factory>
??????? ......
??????? <property name="hibernate.transaction.factory_class">
??org.hibernate.transaction.JTATransactionFactory
??????? </property>
??? </session-factory>
</hibernate-configuration>
鎖(locking)
支持兩種鎖:悲觀鎖和樂觀鎖
悲觀鎖(Pessimistic locking):
數(shù)據(jù)庫(kù)的實(shí)現(xiàn)
select * from account where name='yyy' for update
通過for update子句,這條語(yǔ)句鎖定所有符合條件的記錄,在本次事務(wù)提交之前,外界無法修改這些記錄。
hibernate的實(shí)現(xiàn),也是基于數(shù)據(jù)庫(kù)的鎖機(jī)制實(shí)現(xiàn):
加鎖一般通過以下方法實(shí)現(xiàn):
Criteria.setLockMode
Query.setLockMode
Session.lock
hibernate的加鎖模式:
LockMode.NONE:無鎖機(jī)制
LockMode.WRITE:hibernate在Insert和update時(shí),會(huì)自動(dòng)獲取
LockMode.READ:hibernate在讀取記錄的時(shí)候,會(huì)自動(dòng)獲取
以上3種,由hibernate內(nèi)部使用。
LockMode.UPGRADE:利用數(shù)據(jù)庫(kù)的for update子句加鎖
LockMode.UPGRADE_NOWAIT:oracle特定實(shí)現(xiàn),利用oracle的for update nowait子句實(shí)現(xiàn)加鎖。
樂觀鎖(Optimistic locking):
hibernate在其數(shù)據(jù)訪問引擎中內(nèi)置了樂觀鎖實(shí)現(xiàn)。可以通過class描述符的optimistic-lock屬性結(jié)合version描述符指定。
<hibernate-mapping>
??? <class
??????? name="org.hibernate.sample.TUser"
??????? table="t_user"
??????? dynamic-update="true"
??????? dynamic-insert="true"
??????? optimistic-lock="version"
??? >
???? <id>......
???? </id>
????? <version
???????? column="version"
???????? name="version"
???????? type="java.lang.Integer"
????? />
??? </class>
</hibernate-mapping>
注意,version節(jié)點(diǎn)要在ID節(jié)點(diǎn)之后。
這里,聲明了一個(gè)version屬性,用于存放用戶的版本信息,保存在T_User表的version字段中。
posted on 2006-07-16 10:18
knowhow 閱讀(1336)
評(píng)論(0) 編輯 收藏 所屬分類:
ORM:Hibernate及其他