天天看點

傳智播客李勇Jdbc視訊筆記--事務(轉載)

原文連結:http://longdechuanren.iteye.com/blog/632403

1、事務的概念與JDBC事務處理

(1)原子性(atomicity):組成事務處理的語句形成了一個邏輯單元,不能隻執行其中的一部分。

(2)一緻性(consistency):在事務處理執行前後,資料庫是一緻的(兩個賬戶要麼都變,或者都不變)。

(3)隔離性(isolcation):一個事務處理對另一個事務處理沒有影響。

(4)持續性(durability):事務處理的效果能夠被永久儲存下來 。

舉例:銀行轉賬

connection.setAutoCommit(false);//打開事務。

.....

....把進行轉賬的兩步操作放在同一個事務中,如果一個出現異常,馬上復原

.....

connection.commit();//送出事務。

connection.rollback();//復原事務。

2、事務的儲存點處理:定義儲存點可以用來復原一部分内容

Java代碼

傳智播客李勇Jdbc視訊筆記--事務(轉載)
傳智播客李勇Jdbc視訊筆記--事務(轉載)
傳智播客李勇Jdbc視訊筆記--事務(轉載)
  1. static void test() throws SQLException {   
  2.         Connection conn = null;   
  3.         Statement st = null;   
  4.         ResultSet rs = null;   
  5.         //定義儲存點   
  6.         Savepoint sp = null;   
  7.         try {   
  8.             conn = JdbcUtils.getConnection();   
  9.             conn.setAutoCommit(false);             
  10.             st = conn.createStatement();   
  11.             //修改張三的money值   
  12.             String sql = "update user set money=money-10 where id=1";   
  13.             st.executeUpdate(sql);   
  14.             //設定儲存點   
  15.             sp = conn.setSavepoint();   
  16.             //修改王五的money值   
  17.             sql = "update user set money=money-10 where id=3";   
  18.             st.executeUpdate(sql);   
  19.             sql = "select money from user where id=2";   
  20.             rs = st.executeQuery(sql);   
  21.             float money = 0.0f;   
  22.             if (rs.next()) {   
  23.                 money = rs.getFloat("money");   
  24.             }   
  25.             //如果李四的money的值>300就抛出異常   
  26.             if (money > 300)   
  27.                 throw new RuntimeException("已經超過最大值!");   
  28.             sql = "update user set money=money+10 where id=2";   
  29.             st.executeUpdate(sql);   
  30.             conn.commit();   
  31.         } catch (RuntimeException e) {   
  32.             if (conn != null && sp != null) {   
  33.             //rollback的時候要定義儲存點,否則會全部復原   
  34.                 conn.rollback(sp);   
  35.                 conn.commit();   
  36.             }   
  37.             throw e;   
  38.         } catch (SQLException e) {   
  39.             if (conn != null)   
  40.                 conn.rollback();   
  41.             throw e;   
  42.         } finally {   
  43.             JdbcUtils.free(rs, st, conn);   
  44.         }   
  45.     }   

總結:

1).如果上面的調用産生了異常,那麼張三賬号的會減少,而王五的錢不會變少:儲存點之後的内容會被復原,而儲存點之前的内容不會被復原。

2).事務的復原也可以不復原所有的操作,比如一件事需要三步完成,我們可以在走完第一步後設定一個儲存點,然後再進行第二步和第三步,一旦發生異常,復原到儲存點即可,此時儲存點以後的操作會復原,而儲存點以前的不會(未完全復原)。 

備注:.在MySql資料庫使用過程中如果發現某個資料庫對事務的支援不是很好(比如不能送出或不能復原),則很可能是資料庫的引擎使用不合适(資料庫引擎有很多種,比如InnoDB,MyIsam,其中InnoDB支援資料庫事務,而MyIsam不支援)

3、JTA分布式事務的簡要介紹

跨越多個資料源的事務,使用JTA容器實作事務。

分成兩階段送出。

Java代碼

傳智播客李勇Jdbc視訊筆記--事務(轉載)
傳智播客李勇Jdbc視訊筆記--事務(轉載)
傳智播客李勇Jdbc視訊筆記--事務(轉載)
  1. javax.transaction.UserTransaction tx = (UserTransaction)ctx.lookup(“jndiName");   
  2.     tx.begin();   
  3.     //connection1 connection2 (可能來自不同的資料庫)…    
  4.     tx.commit();//tx.rollback();  

備注:要想實作JTA事務需要JTA容器(Tomcat沒有,Weblogic,Websphere有)的支援,JTA容器就行一個指揮官,指揮着所有的資料庫(一般發2道指令),他會先發出一個送出的請求給是以資料庫,如果此時有資料庫表示要復原,則容器會通知其他資料庫一起復原,如果沒有資料庫提出復原,此時發第二道指令,所有資料庫一起送出。

4、事務的隔離級别

傳智播客李勇Jdbc視訊筆記--事務(轉載)

檢視與設定mysql資料庫的的隔離級别:

檢視:select @@tx_isolation

未送出讀:set transaction isolation level read uncommitted

送出讀:set transaction isolation level read committed

不可重複讀:set transaction isolation level repeatable committed

在預設情況下mysql的事務是自動送出的,輸入指令strat transaction 表示你要

自己手動控制事務,mysql不會幫你自動送出事務 commit指令是送出目前事務

rollback:復原事務

特别說明:本人轉載文章純為技術學習,總結經驗,并無其他目的,若有他人繼續轉載,請連結原作者的位址,而不是本文的位址,以示對作者的尊重。最後對原作者的辛勤勞動表示感謝!

轉載于:https://www.cnblogs.com/hl756799782/archive/2011/10/01/6005286.html