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

          常用鏈接

          留言簿(14)

          隨筆檔案(6)

          文章分類(467)

          文章檔案(423)

          相冊

          收藏夾(18)

          JAVA

          搜索

          •  

          積分與排名

          • 積分 - 827240
          • 排名 - 49

          最新評論

          閱讀排行榜

          評論排行榜

          一、           數(shù)據(jù)庫事務(wù)概念

          數(shù)據(jù)庫事務(wù)的特征: ACID

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

          二、           事務(wù)的邊界

          數(shù)據(jù)庫支持 2 種事務(wù)模式:自動(dòng)提交和手動(dòng)提交。

          JDBC API 的事務(wù)邊界

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

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

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

          Hibernate API 聲明事務(wù)邊界

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

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

          }

          finally
          {
              session.close();
          }

          注:一個(gè) session 可以對應(yīng)多個(gè)事務(wù),但是推薦的做法是一個(gè) session 對應(yīng)一個(gè)事務(wù)。

          三、            多事務(wù)的并發(fā)問題

          當(dāng)多個(gè)事務(wù)同時(shí)訪問相同的數(shù)據(jù)的時(shí)候,程序如果沒有采取適當(dāng)?shù)母綦x措施,就會發(fā)生數(shù)據(jù)庫的并發(fā)問題。常見的并發(fā)問題有:

          第一類丟失更新:撤消事務(wù)的時(shí)候,把其他的事務(wù)已經(jīng)提交的數(shù)據(jù)給覆蓋了;

          臟讀;讀了沒有提交的數(shù)據(jù);

          虛讀:一個(gè)事務(wù)讀到另外一個(gè)事務(wù)已經(jīng)提交的新插入的數(shù)據(jù);

          不可重復(fù)讀:一個(gè)事務(wù)讀到另外一個(gè)事務(wù)已經(jīng)提交的更新的數(shù)據(jù);

          第二類丟失更新:一個(gè)事務(wù)覆蓋另外一個(gè)事務(wù)已經(jīng)提交的更新數(shù)據(jù)。 
          四、          

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

          有一點(diǎn)要關(guān)注的是:鎖的粒度越大,隔離性越好,并發(fā)性越差。

          按照鎖的程度來分有:

          共享鎖:用讀操作,非獨(dú)占的,其他事務(wù)可以讀,但是不能更新,并發(fā)性好;

          獨(dú)占鎖:用與 insert update delete 等語句,其他事務(wù)不能讀,也不能改,并發(fā)性差;

          更新鎖:執(zhí)行 update 的時(shí)候,加鎖。

          死瑣:多是事務(wù)分別鎖定了一個(gè)資源,又請求鎖定對方已經(jīng)鎖定的資源,就造成了請求環(huán)。

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

          五、            數(shù)據(jù)庫的事務(wù)隔離級別

          數(shù)據(jù)庫提供 4 種事務(wù)隔離級別:

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

          Repeatable Read :可重復(fù)讀; 2

          Read Commited :讀已提交數(shù)據(jù); 4

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

          Hiberate 中的隔離級別的設(shè)置

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

          六、            悲觀鎖和樂觀瑣

          從應(yīng)用程序的角度來看,鎖分為悲觀鎖和樂觀鎖。

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

          Select ……. For update;

          Hibernate 中的代碼

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

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

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

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


          posted on 2007-09-16 14:50 Ke 閱讀(1320) 評論(0)  編輯  收藏 所屬分類: hibernate
          主站蜘蛛池模板: 天长市| 简阳市| 罗甸县| 出国| 万盛区| 观塘区| 南阳市| 九江县| 金川县| 西昌市| 宝兴县| 康保县| 武邑县| 任丘市| 德惠市| 大洼县| 梅河口市| 乐平市| 镶黄旗| 大港区| 黔西县| 柘城县| 河曲县| 泸州市| 阿荣旗| 简阳市| 姜堰市| 上虞市| 渝北区| 兴隆县| 颍上县| 阜新| 瓦房店市| 沧州市| 洛阳市| 宁乡县| 青神县| 新丰县| 自贡市| 遂平县| 浙江省|