# 八种事务类型及事务传播机制
* 八种事务类型
| 事务类型 | 说明 |
| --- | --- |
| 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 工具
- 常见问题
- 感谢支持