Java事務在一些面試中會被問到。
面試的時候,我們首先要回答的是:事務能夠保證數據的完整性和一致性。
如果功力深厚點的話:就說一些原理(任務開始前先設置不提交任務,在所有任務完成后再提交任務,
如果任務在中間斷開,就執行回滾,撤銷前面執行的任務),簡單一點就舉個的例子(比如存錢和取錢的問題。
比如:銀行在兩個賬戶之間轉賬,從A賬戶轉入B賬戶1000元,系統先減少A賬戶的1000元,然后再為B賬號增加1000元。如果全部執行成功,數據庫處于一致性;如果僅執行完A賬戶金額的修改,而沒有增加B賬戶的金額,則數據庫就處于不一致狀態,這時就需要取消前面的操作。)
本文對java事務做簡單的探討,一問到java事務我們要知道這和數據庫相關。
一.先看一段簡單的代碼
使用JDBC方式進行事務處理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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()方法撤消事務。
一般來說,專門開發數據庫的開發者肯定是要對事務了解很深入的,
但是一般的程序員不需要花費太多時間在這方面。對大概作用有個理解就可以了。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:http://blog.csdn.net/wenzhi20102321/article/details/52651134