隨筆 - 6  文章 - 129  trackbacks - 0
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(14)

          隨筆檔案(6)

          文章分類(467)

          文章檔案(423)

          相冊

          收藏夾(18)

          JAVA

          搜索

          •  

          積分與排名

          • 積分 - 827218
          • 排名 - 49

          最新評論

          閱讀排行榜

          評論排行榜

          一、           數據庫事務概念

          數據庫事務的特征: 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> 可以管理并發。樂觀瑣比悲觀瑣有更好的并發性,優先考慮樂觀瑣。  

          http://www.aygfsteel.com/sodmewuhan/archive/2006/04/22/42505.html


          posted on 2007-09-16 14:50 Ke 閱讀(1320) 評論(0)  編輯  收藏 所屬分類: hibernate
          主站蜘蛛池模板: 海伦市| 东明县| 抚顺县| 金秀| 保山市| 监利县| 娱乐| 铜陵市| 富顺县| 囊谦县| 阜宁县| 扬中市| 来宾市| 永兴县| 广州市| 西华县| 江西省| 响水县| 张北县| 平乡县| 比如县| 吴堡县| 汝城县| 安徽省| 沁水县| 绥江县| 穆棱市| 岗巴县| 张家界市| 临邑县| 渭南市| 罗田县| 安图县| 璧山县| 赞皇县| 海伦市| 会昌县| 曲靖市| 南岸区| 通道| 阜城县|