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()方法撤消事務。
一般來說,專門開發數據庫的開發者肯定是要對事務了解很深入的,
但是一般的程序員不需要花費太多時間在這方面。對大概作用有個理解就可以了。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!