一、什麼是事務?
在人員管理系統中,你刪除一個人員,你即需要刪除人員的基本資料,也要刪除和該人員相關的信息,如信箱,文章等等,這樣,這些數據庫操作語句就構成一個事務!
二、事務是必須滿足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();//回滾事務
}
五、ssm中處理事務
1、配置文件中加入事務管理配置
<!-- 配置事務管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 註解方式配置事務 -->
<tx:annotation-driven transaction-manager="transactionManager" />
2、在調用的方法上加上@Transactional註解(必須爲public方法才行,不要捕捉異常,要讓異常自動拋出,否則不能進行事務回滾。方法要寫在服務層中在controller中無效)