在數據庫操作中,一項事務是指由一條或多條對數據庫更新的sql語句所組成的一個不可分割的工作單元。只有當事務中的所有操作都正常完成了,整個事務才能被提交到數據庫,如果有一項操作沒有完成,就必須撤消整個事務。
例如在銀行的轉帳事務中,假定張三從自己的帳號上把1000元轉到李四的帳號上,相關的sql語句如下:
update account set monery=monery-1000 where name='zhangsan'
update account set monery=monery+1000 where name='lisi'
這個兩條語句必須作為一個完成的事務來處理。只有當兩條都成功執行了,才能提交這個事務。如果有一句失敗,整個事務必須撤消。
在connection類中提供了3個控制事務的方法:
(1) setAutoCommit(Boolean autoCommit):設置是否自動提交事務;
(2) commit();提交事務;
(3) rollback();撤消事務;
在jdbc api中,默認的情況為自動提交事務,也就是說,每一條對數據庫的更新的sql語句代表一項事務,操作成功後,系統自動調用commit()來提交,否則將調用rollback()來撤消事務。
在jdbc api中,可以通過調用setAutoCommit(false) 來禁止自動提交事務。然後就可以把多條更新數據庫的sql語句做為一個事務,在所有操作完成之後,調用commit()來進行整體提交。倘若其中一項 sql操作失敗,就不會執行commit()方法,而是產生相應的sqlexception,此時就可以捕獲異常代碼塊中調用rollback()方法撤消事務。
• 示例:
• 有這樣一張名叫test_user的表:uid為1的money為0元,uid為2的money為300元,uid為3的money為800元。現在uid為3的人向uid為1的人轉賬,每次50元。當uid為3的人的賬戶中的money少於或等於700的元的時候,則停止轉賬。也就是說,最後的uid為1的人賬戶為100元,uid為3的賬戶700元。
事務操作的基本流程是:當達到某個條件時拋出一個異常,在這個異常處理中回滾操作。事務最大的一個特點是,要麼全部執行,要麼不執行。但是,對於使用JAVA來操作數據庫事務來說,並沒用我們想的那麼簡單:下面這段代碼故意將某個字段寫錯,來檢驗java是如何操作數據庫的事務的:
public class TransactionTest {
public static void main(String[] args) throws Exception {
Connection conn = ConnectionFactory.getInstance().getLocalConnection(); //換成自己的連接代碼
int money=0;
ResultSet rt=null;
try {
conn.setAutoCommit(false); //修改提交方式,關閉自動提交模式
Statement st =conn.createStatement();
String addMoneySql = "update test_user set money=money+50 where uid=1;";
int flag0= st.executeUpdate(addMoneySql);
System.out.println(flag0);
String reduceMoneySql = "update test_user set money=money-50 where uid=3";
int flag1 =st.executeUpdate(reduceMoneySql);
System.out.println(flag1);
String queryMoneySql="select money from test_user where uid=3";
rt=st.executeQuery(queryMoneySql);
if(rt.next()){
money=rt.getInt("mone");
//這裡故意將字段打錯,檢驗java如何執行事務的,原字段為money
System.out.println(money);
}
if(money<=700){
throw new RuntimeException("3號的錢已經不夠了,不要匯款了");
//拋出一個異常,在異常處理中回滾操作
}
conn.commit();
} catch (Exception e) {
e.printStackTrace();//打印出上面拋出來的異常,否則是不會顯示的。
if(conn!=null){
conn.rollback();
}
}
}
}
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2013-12/93570p2.htm