事務處理:
Hibernate本身并不具備事務管理能力。在事務管理層,Hibernate將其委托給底層的JDBC或者JTA,以實現事務的管理與調度。
基于JDBC的事務:
無疑是最簡單的實現方式,
session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
tx.commit();
基于JTA的事務管理:
hibernate默認采用JDBC Transacion??梢酝ㄟ^配置文件指定采用JTA作為事務管理實現。
<hibernate-configuration>
<session-factory>
......
<property name="hibernate.transaction.factory_class">
org.hibernate.transaction.JTATransactionFactory
</property>
</session-factory>
</hibernate-configuration>
鎖(locking)
支持兩種鎖:悲觀鎖和樂觀鎖
悲觀鎖(Pessimistic locking):
數據庫的實現
select * from account where name='yyy' for update
通過for update子句,這條語句鎖定所有符合條件的記錄,在本次事務提交之前,外界無法修改這些記錄。
hibernate的實現,也是基于數據庫的鎖機制實現:
加鎖一般通過以下方法實現:
Criteria.setLockMode
Query.setLockMode
Session.lock
hibernate的加鎖模式:
LockMode.NONE:無鎖機制
LockMode.WRITE:hibernate在Insert和update時,會自動獲取
LockMode.READ:hibernate在讀取記錄的時候,會自動獲取
以上3種,由hibernate內部使用。
LockMode.UPGRADE:利用數據庫的for update子句加鎖
LockMode.UPGRADE_NOWAIT:oracle特定實現,利用oracle的for update nowait子句實現加鎖。
樂觀鎖(Optimistic locking):
hibernate在其數據訪問引擎中內置了樂觀鎖實現??梢酝ㄟ^class描述符的optimistic-lock屬性結合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節點要在ID節點之后。
這里,聲明了一個version屬性,用于存放用戶的版本信息,保存在T_User表的version字段中。