事務
事務:是指邏輯上的一組操作,這組操作要麼全部成功,要麼全部失敗。
事務的特性:
- 原子性:原子性是指事務是一個不可 分割的工作單位,事務中的操作要麼都發生,要麼都不發生。
- 一致性:一致性是指事務前後數據的完整性必須保持一致
- 隔離型:是指多個用戶併發訪問數據庫時,一個用戶的事務不能被其他用戶的事務所幹擾,多個併發事務直接數據要相互隔離
- 持久性:是指一個事務一旦被提交,它對數據庫中數據的改變是永久性的,即使數據庫發生故障也不應該對其有任何影響
Spring支持兩種方式事務管理:
1.編程式事務管理
- 在實際應用中很少使用
- 通過TransactionTemplate手動管理事務
2.使用XML配置聲明式事務
- 開發中推薦使用(代碼入侵性最小)
- Spring的聲明式事務是通過AOP實現的
- 基於TransactionProxyFactoryBean的方式.(很少使用)
需要爲每個進行事務管理的類,配置一個TransactionProxyFactoryBean進行增強.
- 基於AspectJ的XML方式.(經常使用)
一旦配置好之後,類上不需要添加任何東西
- 基於註解方式.(經常使用)
配置簡單,需要在業務層上添加一個@Transactional的註解.
事務的API接口介紹
- Platform TransactionManager(事務管理器)
Spring爲不同的持久化框架提供不同的Platform TransactionManager接口實現
- TransactionDefinition(事務定義信息(隔離、傳播、超時、只讀))
TransactionDefinition事務定義信息:定義隔離信息
髒讀:一個事務讀取了另一個事務改寫但還未提交的數據,如果這些數據被回滾,則讀到的數據是無效的
不可重複讀:在同一個事務中,多次讀取同一數據返回的結果有所不同
幻讀:一個事務讀取了幾行記錄後,另一個事務插入一些記錄,幻讀就發生了。再後來的查詢中,第一個事務就會發現有些 原來沒有的記錄
事務的隔離級別:
MySQL默認採用REPEATABLE _READ隔離級別
Oracle默認採用READ_COMMITTED隔離級
TransactionDefinition事務定義信息:定義事務的傳播行爲
重點記標紅的,標紅的是比較常用的。
- TransactionStatus(事務具體運行狀態)
用來記錄事務的狀態 ,該接口定義了一組方法,用來獲取或判斷事務的相應狀態信息。
平臺事務管理器(PlatformTransactionManager)會根據TransactionDefinition中定義的事務信息(包括隔離級別、傳播行爲)來進行事務的管理,在管理的過程中事務可能產生了保存點或事務是新的事務等情況,那麼這些信息都會記錄在TransactionStatus的對象中。