Java事務的簡單使用
Java事務在一些面試中會被問到。
面試的時候,我們首先要回答的是:事務能夠保證資料的完整性和一致性。
如果功力深厚點的話:就說一些原理(任務開始前先設定不提交任務,在所有任務完成後再提交任務,
如果任務在中間斷開,就執行復原,撤銷前面執行的任務),簡單一點就舉個的例子(比如存錢和取錢的問題。
比如:銀行在兩個賬戶之間轉賬,從A賬戶轉入B賬戶1000元,系統先減少A賬戶的1000元,然後再為B帳號增加1000元。如果全部執行成功,資料庫處於一致性;如果僅執行完A賬戶金額的修改,而沒有增加B賬戶的金額,則資料庫就處於不一致狀態,這時就需要取消前面的操作。)
本文對java事務做簡單的探討,一問到java事務我們要知道這和資料庫相關。
一.先看一段簡單的代碼
使用JDBC方式進行交易處理
public int delete(int sID) { //實現資料庫連接的類 DataBaseConnection dbc = new DataBaseConnection(); //擷取連線物件 Connection con = dbc.getConnection(); try { con.setAutoCommit(false);// 更改JDBC事務的預設提交方式 dbc.executeUpdate("delete from xiao where ID=" + sID); dbc.executeUpdate("delete from xiao_content where ID=" + sID); dbc.executeUpdate("delete from xiao_affix where bylawid=" + sID); con.commit();//提交JDBC事務 con.setAutoCommit(true);// 恢複JDBC事務的預設提交方式 dbc.close(); return 1; } catch (Exception exc) { con.rollBack();//復原JDBC事務 dbc.close(); return -1; } }
上面這一段代碼就是一個比較簡單的java事務的執行。
上面三次執行刪除操作,只要有一次執行失敗,都會執行任務復原,相當於要麼一起成功,要麼什麼都沒做。
如果沒有事務的管理,前面執行了就會馬上在資料庫裡面更新,
執行到哪裡失敗就退出不再執行後面的任務,不能保證資料的一致性。
二.Java事務的基礎概念
原子性(Atomicity) :事務是一個完整的操作。事務的各步操作是不可分的(原子的);
要麼都執行,要麼都不執行
一致性(Consistency):當事務完成時,資料必須處於一致狀態
隔離性(Isolation) :對資料進行修改的所有並發事務是彼此隔離的,這表明事務必須是獨立的,
它不應以任何方式依賴於或影響其他事務
永久性(Durability) :事務完成後,它對資料庫的修改被永久保持,交易記錄能夠保持事務的永久性
java的交易處理描述:如果對資料庫進行多次操作,每一次的執行或步驟都是一個事務.
如果資料庫操作在某一步沒有執行或出現異常而導致事務失敗,這樣有的事務被執行有的就沒有被執行,
從而就有了事務的復原,取消先前的操作.....
在資料庫操作中,一項事務是指由一條或多條對資料庫更新的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()方法撤消事務。
一般來說,專門開發資料庫的開發人員肯定是要對事務瞭解很深入的,
但是一般的程式員不需要花費太多時間在這方面。對大概作用有個理解就可以了。
感謝閱讀,希望能協助到大家,謝謝大家對本站的支援!