一、什麼是事務?
在人員管理系統中,你刪除一個人員,你即需要刪除人員的基本資料,也要刪除和該人員相關的信息,如信箱,文章等等,這樣,這些數據庫操作語句就構成一個事務!
二、事務是必須滿足4個條件(ACID)
- 事務的原子性( Atomicity):一組事務,要麼成功;要麼撤回。
- 一致性 (Consistency):事務執行後,數據庫狀態與其他業務規則保持一致。如轉賬業務,無論事務執行成功否,參與轉賬的兩個賬號餘額之和應該是不變的。
- 隔離性(Isolation):事務獨立運行。一個事務處理後的結果,影響了其他事務,那麼其他事務會撤回。事務的100%隔離,需要犧牲速度。
- 持久性(Durability):軟、硬件崩潰後,InnoDB數據表驅動會利用日誌文件重構修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit 選項 決定什麼時候吧事務保存到日誌裏。
三、併發事務問題
- 髒讀(dirty read):讀到另一個事務的未提交新數據,即讀取到了髒數據;
- 不可重複讀(unrepeatable):對同一記錄的兩次讀取不一致,因爲另一事務對該記錄做了修改;
- 幻讀(虛讀)(phantom read):對同一張表的兩次查詢不一致,因爲另一事務插入了一條記錄。
四、jdbc處理事務
同一事務中所有的操作,都在使用同一個Connection對象。
Connection的三個方法與事務有關:
- setAutoCommit(boolean):設置是否爲自動提交事務,如果true(默認值爲true)表示自動提交,也就是每條執行的SQL語句都是一個單獨的事務,如果設置爲false,那麼相當於開啓了事務了;con.setAutoCommit(false) 表示開啓事務。
- commit():提交結束事務。
- rollback():回滾結束事務。
try{
con.setAutoCommit(false);//開啓事務
......
con.commit();//try的最後提交事務
} catch() {
con.rollback();//回滾事務
}