數據庫中的事務管理

一、什麼是事務?

  在人員管理系統中,你刪除一個人員,你即需要刪除人員的基本資料,也要刪除和該人員相關的信息,如信箱,文章等等,這樣,這些數據庫操作語句就構成一個事務!

二、事務是必須滿足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中無效)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章