面朝大海,春暖花開

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            12 Posts :: 1 Stories :: 3 Comments :: 0 Trackbacks

          一、?????????? 數據庫事務概念

          數據庫事務的特征: ACID

          Atomic (原子性)、 Consistency (一致性)、 Isolation (隔離性)和 Durability (持久性)。 DBMS 用日志來保證數據的原子性、一致性和持久性;用鎖的機制來保證數據的隔離性。

          二、?????????? 事務的邊界

          數據庫支持 2 種事務模式:自動提交和手動提交。

          JDBC API 的事務邊界

          try
          {
          ????Connection?conn?
          = ?java.sql.DriverManager,.getConnection(dbUrl,dbUser,dbPwd);
          ????conn.setAutoCommit(
          false );? // 設置成手動模式
          ????stmt? = ?conn.createStatement();
          ????stmt.executeUpdate(
          " . " );? // 數據庫更新1
          ????stmt.executeUpdate( " . " );? // 數據庫更新2
          ????
          ????conn.commit();
          }

          catch (Exception?e)
          {
          ????conn.rollback();
          }

          finally
          {
          ????stmt.close();
          ????conn.close();
          }

          Hibernate API 聲明事務邊界

          Session?session? = ?factory.openSession();
          Transaction?tx;
          try ?
          {
          ????tx?
          = ?session.beginTransaction();? // 開始事務
          ????
          // 執行操作
          ????。。。。。
          ????
          ????tx.commit();
          }

          catch ?(Exception?e)
          {
          ????
          if ?(tx != null )
          ????
          {
          ????????tx.rollback();
          ????}

          }

          finally
          {
          ????session.close();
          }

          注:一個 session 可以對應多個事務,但是推薦的做法是一個 session 對應一個事務。

          三、 ?????????? 多事務的并發問題

          當多個事務同時訪問相同的數據的時候,程序如果沒有采取適當的隔離措施,就會發生數據庫的并發問題。常見的并發問題有:

          第一類丟失更新:撤消事務的時候,把其他的事務已經提交的數據給覆蓋了;

          臟讀;讀了沒有提交的數據;

          虛讀:一個事務讀到另外一個事務已經提交的新插入的數據;

          不可重復讀:一個事務讀到另外一個事務已經提交的更新的數據;

          第二類丟失更新:一個事務覆蓋另外一個事務已經提交的更新數據。?
          四、??????????

          一般地,大型的 DBMS 都會自動的管理鎖定機制,但是在對數據的安全性、完整性和一致性有特殊要求的地方,可以由事務本身來管理瑣的機制。

          有一點要關注的是:鎖的粒度越大,隔離性越好,并發性越差。

          按照鎖的程度來分有:

          共享鎖:用讀操作,非獨占的,其他事務可以讀,但是不能更新,并發性好;

          獨占鎖:用與 insert update delete 等語句,其他事務不能讀,也不能改,并發性差;

          更新鎖:執行 update 的時候,加鎖。

          死瑣:多是事務分別鎖定了一個資源,又請求鎖定對方已經鎖定的資源,就造成了請求環。

          降低死鎖的最好辦法是使用短事務。

          五、 ?????????? 數據庫的事務隔離級別

          數據庫提供 4 種事務隔離級別:

          Serializable :串行化;(隔離級別最高) 1

          Repeatable Read :可重復讀; 2

          Read Commited :讀已提交數據; 4

          Read Uncommited :讀未提交數據;(隔離級別最低) 8

          Hiberate 中的隔離級別的設置

          Hibernate 的配置文件中 hibernate.connection.isolation=2

          六、 ?????????? 悲觀鎖和樂觀瑣

          從應用程序的角度來看,鎖分為悲觀鎖和樂觀鎖。

          悲觀鎖:顯示的為程序加鎖,但是降低并發性。

          Select ……. For update;

          Hibernate 中的代碼

          Session.get(Account.class,net Long(1),LockMode.UPGRADE) // 程序采用悲觀鎖

          樂觀鎖:依靠 DBMS 來管理鎖,程序依靠版本控制來避免并發問題。

          在對象 - 關系映射的文件中,用 <version> 或者 <timestamp> 可以管理并發。樂觀瑣比悲觀瑣有更好的并發性,優先考慮樂觀瑣。 ?

          posted on 2006-04-22 17:12 面朝大海 閱讀(883) 評論(0)  編輯  收藏 所屬分類: J2EE

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 康乐县| 阳新县| 周宁县| 江阴市| 邢台市| 莱芜市| 砚山县| 莱阳市| 兴安县| 麟游县| 布尔津县| 舒兰市| 大方县| 广汉市| 兴文县| 罗田县| 龙江县| 星子县| 大姚县| 灵山县| 莲花县| 萝北县| 遵义市| 江都市| 金平| 谷城县| 平遥县| 营山县| 衡阳市| 泾川县| 罗江县| 杭锦后旗| 乌什县| 安远县| 措美县| 二手房| 哈尔滨市| 宜昌市| 阳信县| 商水县| 三亚市|