Topquan's Blog

          分享價值----成就你我----我的博客----你的家

          hibernate事務處理和鎖

          事務處理:
          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字段中。

          posted on 2006-08-05 01:18 topquan 閱讀(2678) 評論(0)  編輯  收藏 所屬分類: Hibernate

          主站蜘蛛池模板: 土默特右旗| 上栗县| 迁安市| 长兴县| 广州市| 安仁县| 扎兰屯市| 洛川县| 林甸县| 徐闻县| 平定县| 南城县| 永定县| 新宁县| 遵化市| 二手房| 闻喜县| 怀仁县| 蓝田县| 达州市| 泸定县| 长岛县| 沈阳市| 贵南县| 贵德县| 全椒县| 吉林省| 锦屏县| 茌平县| 绥芬河市| 长阳| 宜城市| 香港 | 湘乡市| 金阳县| 克拉玛依市| 全椒县| 湖北省| 峨边| 通道| 甘泉县|