# 八種事務類型及事務傳播機制
* 八種事務類型
| 事務類型 | 說明 |
| --- | --- |
| PROPAGATION_REQUIRED | 表示如果當前事務存在,則支持當前事務。否則,會啟動一個新的事務。xorm中默認事務類型。 |
| PROPAGATION_SUPPORTS | 表示如果當前事務存在,則支持當前事務,如果當前沒有事務,就以非事務方式執行。 |
| PROPAGATION_MANDATORY | 表示如果當前事務存在,則支持當前事務,如果當前沒有事務,則返回事務嵌套錯誤。 |
| PROPAGATION_REQUIRES_NEW | 表示新建一個全新Session開啟一個全新事務,如果當前存在事務,則把當前事務掛起。 |
| PROPAGATION_NOT_SUPPORTED | 表示以非事務方式執行操作,如果當前存在事務,則新建一個Session以非事務方式執行操作,把當前事務掛起。 |
| PROPAGATION_NEVER | 表示以非事務方式執行操作,如果當前存在事務,則返回事務嵌套錯誤。 |
| PROPAGATION_NESTED | 表示如果當前事務存在,則在嵌套事務內執行,如嵌套事務回滾,則只會在嵌套事務內回滾,不會影響當前事務。如果當前沒有事務,則進行與PROPAGATION_REQUIRED類似的操作。 |
| PROPAGATION_NOT_REQUIRED | 表示如果當前沒有事務,就新建一個事務,否則返回錯誤。 |
* 事務傳播機制
<b>1. PROPAGATION_REQUIRED </b>
PROPAGATION_REQUIRED類型的事務,如果當前Session中如果已經開啟了數據庫事務,并且有程序在控制這個事務。那么在處理 REQUIRED 行為時將會忽略 commit/rollback 操作,這是加入已有事務的特征。當前Session中如果沒有事務那么會開啟新一個新事務。
| 時間| 事務1 | 事務2|
| --- | --- |--- |
|T1| 開始事務| |
|T2| 操作1... | |
|T3| |加入事務1|
|T4 | |操作2...|
|T5 |操作3...| |
|T6 |遞交事務| |
說明: 事務1是當前Session中存在的事務,事務2是們我們新建的PROPAGATION_REQUIRED類型的事務
<b>2.PROPAGATION_SUPPORTS </b>
ROPAGATION_SUPPORTS類型的事務和PROPAGATION_REQUIRED類型的事務的區別在于,當前Session中如果沒有事務那么PROPAGATION_SUPPORTS類型的事務會以非事務方式執行。
<b>3. PROPAGATION_MANDATORY</b>
PROPAGATION_MANDATORY類型的事務和PROPAGATION_REQUIRED類型的事務的區別在于,當前Session中如果沒有事務那么PROPAGATION_MANDATORY類型的事務在開啟時會返回事務嵌套錯誤。
<b>4. PROPAGATION_REQUIRES_NEW</b>
PROPAGATION_REQUIRES_NEW類型的事務強調事務獨立性。它保證了每個事務狀態管理范圍內鎖使用的數據庫連接是彼此不一樣的。例如獨立事務會滿足,事務1中存在事務2,當事務2遞交的時候不影響事務1。兩個事務之間不存在相互關聯關系。開啟事務2時,事務1會掛起,等事務2提交完成后,會恢復事務1,繼續執行。當前Session中如果沒有事務那么會開啟新一個新事務。
| 時間| 事務1 | 事務2|
| --- | --- |--- |
|T1| 開始事務| |
|T2| 操作1... | |
|T3| |掛起事務1|
|T4| |開始事務|
|T5 | |操作2...|
|T6 | |遞交事務|
|T7 | |恢復事務1|
|T8 |操作3...| |
|T9 |遞交事務| |
說明: 事務1是當前Session中存在的事務,事務2是們我們新建的PROPAGATION_REQUIRES_NEW類型的事務。事務1和事務2存在于不同Session中,事務執行結束后,請注意在適當的位置關閉事務所存在的Session。
<b>5. PROPAGATION_NOT_SUPPORTED</b>
PROPAGATION_NOT_SUPPORTED類型的事務與PROPAGATION_REQUIRES_NEW類型事務的區別在于,PROPAGATION_NOT_SUPPORTED類型的事務在掛起當前Session中已經開啟了的數據庫事務之后不會在嘗試開啟新的事務。
| 時間| 事務1 (開啟事務)| 事務2(非事務)|
| --- | --- |--- |
|T1| 開始事務| |
|T2| 操作1... | |
|T3| |掛起事務1|
|T4 | |操作2...|
|T4 | |操作3...|
|T5 | |恢復事務1|
|T6 |操作4...| |
|T7 |遞交事務| |
說明:事務1和事務2存在于不同Session中,事務執行結束后,請注意在適當的位置關閉事務所存在的Session。
<b>6. PROPAGATION_NEVER</b>
PROPAGATION_NEVER類型的事務,強調了非事務。一旦發現當前Session中已存在的事務,則返回事務嵌套錯誤。
<b>7. PROPAGATION_NESTED</b>
PROPAGATION_NESTED類型的事務,如果當前Session中存在的事務,則運行開啟一個嵌套的事務,創建一個回滾的保存點。如果當前Session沒有活動事務,則創建一個新事務。內部事務的回滾不會對外部事務造成影響。如外部事務回滾,則內部嵌套事務一起回滾。
| 時間| 事務1 | 事務2|
| --- | --- |--- |
|T1| 開始事務| |
|T2| 操作1... | |
|T3| |創建事務保存點|
|T4 | |操作2...|
|T5 | |遞交/回滾保存點|
|T6 |操作3...| |
|T7 |遞交事務| |
<b>8. PROPAGATION_NOT_REQUIRED</b>
PROPAGATION_NOT_REQUIRED類型事務與PROPAGATION_REQUIRED的事務正好相反,如果當前Session中如果已經開啟了數據庫事務,則返回錯誤,否則,會啟動一個新的事務。 該類型可以保障創建的事務只會在嵌套事務層級中是頂層事務,否則則會返回錯誤。
- xorm
- 創建Orm引擎
- 定義表結構體
- 名稱映射規則
- 前綴映射,后綴映射和緩存映射
- 使用Table和Tag改變名稱映射
- Column屬性定義
- 表結構操作
- 獲取數據庫信息
- 表操作
- 創建索引和唯一索引
- 同步數據庫結構
- 導入導出SQL腳本
- SqlMap及SqlTemplate模板
- 初始化SqlMap配置文件及SqlTemplate模板
- SqlMap及SqlTemplate相關功能API
- SqlMap配置文件及SqlTemplate模板加密存儲及解析
- 手動管理SqlMap配置及SqlTemplate模板
- 插入數據
- ORM方式插入數據
- 執行SQL命令插入數據
- 創建時間Created
- 查詢和統計數據
- ORM方式查詢和統計數據
- 查詢條件方法
- 臨時開關方法
- Get方法
- Find方法
- Join的使用
- Iterate方法
- Count方法
- Rows方法
- Sum系列方法
- Exist方法
- 子查詢
- 執行SQL查詢
- 執行SQL查詢的11種常用方式
- 查詢返回json或xml字符串
- 鏈式查詢據操返回某條記錄的某個字段的值
- SqlTemplateClient執行過程
- 關于數據庫分頁查詢
- 更新數據
- ORM方式更新數據
- Update方法
- 樂觀鎖Version
- 更新時間Updated
- 執行SQL命令更新數據
- 刪除數據
- ORM方式刪除數據
- Delete方法
- 軟刪除Deleted
- 執行SQL命令刪除數據
- 事務處理
- 簡單事務模型
- 嵌套事務模型
- 八種事務類型及事務傳播機制
- 簡單事務相關API
- 嵌套事務相關API
- 嵌套事務示例代碼
- 主從數據庫(Master/Slave)讀寫分離
- 創建引擎組
- 負載策略
- 引擎組其他配置方法
- 數據庫讀寫分離
- 批量混合SQL操作
- SQL Builder
- 緩存
- 事件
- 數據導出
- Dump數據庫結構和數據
- 查詢結果集導出csv、tsv、xml、json、xlsx、yaml、html
- 多Sheet頁數據導出
- 日志
- 連接池
- xorm 工具
- 常見問題
- 感謝支持