定義
邏輯上的一組操作,要么全做,要么全不做。
四大特性(簡稱ACID):
- 原子性(Atomicity)
事務是不可分割工作單元 - 一致性(Consistency)
事務前后數據的完整性必須保持一致 - 隔離性(Isolation)
多個用戶并發訪問時,多個并發事務之間是數據相互隔離的 - 持久性(Durability)
一個事務一旦被提交,它對數據庫中數據的改變就是永久性的
常用API
3個主要接口
- PlatformTransactionManager
事務管理器 - TransactionDefinition
事務定義信息 - TransactionStatus
事務具體運行狀態
事務隔離級別
如果不考慮隔離性,會引發安全問題:
1.臟讀:一個事務讀取了另一個事務改寫但還未提交的數據,如果這些數據被回滾,則讀到的數據是無效的。
2.不可重復讀:在同一事務中,多次讀取同一數據返回的結果有所不同。
3.幻讀(虛讀):一個事務讀取幾行記錄后,另一個事務插入一些記錄,幻讀就發生了。在后來的查詢中,第一個事務就會發現有些原來沒有的記錄。
補充:
(1)Mysql 默認采用的 REPEATABLE_READ隔離級別
(2)Oracle 默認采用的 READ_COMMITTED隔離級別
事務傳播行為
補充:
第一類共同點:如果 A 方法中有事務,則調用 B 方法時就用該事務,即:A和B方法在同一個事務中。PROPAGATION_REQUIRED:如果 A 方法中沒有事務,則調用 B 方法時就創建一個新的事務,即:A和B方法在同一個事務中。PROPAGATION_SUPPORTS:如果 A 方法中沒有事務,則調用 B 方法時就不使用該事務。PROPAGATION_MANDATORY:如果 A 方法中沒有事務,則調用 B 方法時就拋出異常。
第二類共同點:A方法和B方法沒有在同一個事務里面。PROPAGATION_REQUIRES_NEW:如果 A 方法中有事務,則掛起并新建一個事務給 B 方法。PROPAGATION_NOT_SUPPORTED:如果 A 方法中有事務,則掛起。PROPAGATION_NEVER:如果 A 方法中有事務,則報異常。
第三類:如果 A 方法有的事務執行完,設置一個保存點,如果 B 方法中事務執行失敗,可以滾回保存點或初始狀態。
重點的三種:PROPAGATION_REQUIRED, PROPAGATION_REQUIRES_NEW, PROPAGATION_NESTED。
編程式事務
實際中很少使用
通過TransactionTemplate手動管理事務
聲明式事務
開發過程中推薦使用
通過使用AOP實現
在配置文件XML中
使用方式
- 注解
- AspectJ
- 基于TransactionProxyFactoryBean方式