Oracle中交易處理

來源:互聯網
上載者:User

1.  什麼是事務

     事務用於保證資料的一致性,它由一組相關的dml語句組成,該組的dml(資料操作語言,增刪改,沒有查詢)語句要麼全部成功,要麼全部失敗。

     例:網上轉賬就是典型的要用事務來處理,用於保證資料的一致性。

 

2.  事務和鎖

     當執行事務操作時(dml語句),oracle會在被作用的表上加鎖,防止其它使用者修改表的結構。這裡對我們的使用者來講是非常重要的。其它進程排序,知道1號進程完成,鎖開啟,2號進程進入。依次進行,如果有進程層級較高的,可以插隊。

 

3.  提交事務

     當執行commit語句可以提交事務。當執行了commit語句之後,會確認事務的變化、結束事務。刪除儲存點、釋放鎖,當使用commit語句結束事務之後,其它會話將可以查看到事務變化後的新資料。
      儲存點就是為回退做的。儲存點的個數沒有限制。

 

4.  回退事務

     在介紹回退事務前,我們先介紹一下儲存點(savepoint)的概念和作用。儲存點是事務中的一點。用於取消部分事務,當結束事務時,會自動的刪除該事務所定義的所有儲存點。當執行rollback時,通過指定儲存點可以回退到指定的點,這裡我們作圖說明。

 

5.  事務的幾個重要操作

(1). 設定儲存點 savepoint a
(2). 取消部分事務 rollback to a
(3). 取消全部事務 rollback

     這個回退事務,必須是沒有commit前使用的;如果事務提交了,那麼無論你剛才做了多少個儲存點,都統統沒有。如果沒有手動執行commit,而是exit了,那麼會自動認可。

 

6.  java程式中如何使用事務

     在java操作資料庫時,為了保證資料的一致性,比如賬戶操作(1)從一個賬戶中減掉10$(2)在另一個賬戶上加入10$,我們看看如何使用事務?

package com.sp;</p><p>import java.sql.Connection;<br />import java.sql.DriverManager;<br />import java.sql.ResultSet;<br />import java.sql.Statement;</p><p>public class TestTrans {</p><p>public static void main(String[] args) {<br />try {</p><p>// 1.載入驅動<br />Class.forName("oracle.jdbc.driver.OracleDriver");</p><p>// 2.得到串連<br />Connection ct = DriverManager.getConnection(<br />"jdbc:oracle:thin:@127.0.0.1:1521:orcl", "scott", "tiger");</p><p>Statement sm = ct.createStatement();</p><p>// 從scott的sal中減去100<br />sm.executeUpdate("update emp set sal=sal-100 where ename='SCOTT'");</p><p>int i = 7 / 0;</p><p>// 給smith的sal加上100<br />sm.executeUpdate("update emp set sal=sal+100 where ename='SMITH'");</p><p>// 關閉開啟的資源<br />sm.close();<br />ct.close();<br />} catch (Exception e) {<br />e.printStackTrace();<br />}</p><p>}</p><p>}

運行,會出現異常,查看資料庫,SCOTT的sal減了100,但是SMITH的sal卻不變,很可怕。。。我們怎樣才能保證,這兩個操作要麼同時成功,要麼同時失敗呢?

package com.sp;</p><p>import java.sql.Connection;<br />import java.sql.DriverManager;<br />import java.sql.SQLException;<br />import java.sql.Statement;</p><p>public class TestTrans {</p><p>public static void main(String[] args) {<br />Connection ct = null;<br />try {<br />// 1.載入驅動<br />Class.forName("oracle.jdbc.driver.OracleDriver");</p><p>// 2.得到串連<br />ct = DriverManager.getConnection(<br />"jdbc:oracle:thin:@127.0.0.1:1521:orcl", "scott", "tiger");</p><p>// 加入交易處理<br />ct.setAutoCommit(false);// 設定不能預設提交</p><p>Statement sm = ct.createStatement();</p><p>// 從scott的sal中減去100<br />sm.executeUpdate("update emp set sal=sal-100 where ename='SCOTT'");</p><p>int i = 7 / 0;</p><p>// 給smith的sal加上100<br />sm.executeUpdate("update emp set sal=sal+100 where ename='SMITH'");</p><p>// 提交事務<br />ct.commit();</p><p>// 關閉開啟的資源<br />sm.close();<br />ct.close();<br />} catch (Exception e) {<br />// 如果發生異常,就復原<br />try {<br />ct.rollback();<br />} catch (SQLException e1) {<br />e1.printStackTrace();<br />}<br />e.printStackTrace();<br />}</p><p>}</p><p>}

 

7.  唯讀事務

     唯讀事務是指只允許執行查詢的操作,而不允許執行任何其它dml操作的事務,使用唯讀事務可以確保使用者只能取得某時間點的資料。假定機票代售點每天18點開始統計今天的銷售情況,這時可以使用唯讀事務。在設定了唯讀事務後,儘管其它會話可能會提交新的事務,但是唯讀事務將不會取得最新資料的變化,從而可以保證取得特定時間點的資料資訊。

設定唯讀事務

set transaction read only;

例:有個機票代售系統,管理員要在每天18:00統計賣出多少票,但是在統計時,不能把該事務鎖定,也就是別人還可以買票,這時就需要使用唯讀事務。

例:使用者 system 登入,首先 set transaction read only; 使用者 scott 登入,執行 select * from emp; 此時有14條記錄,然後執行 insert into emp values (8888, 'skycloud', 'CLERK', 7900, to_date('1987-12-12', 'yyyy-mm-dd'), 500, 0, 10); 此時執行 select * from emp; 顯示15條記錄,但是使用者 system 執行 select * from scott.emp; 仍然是14條記錄。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.