事务的模型


    事务的实现,在不同的数据库系统中是不同的,这是因为事务有着不同的模型,在Jim Gray的《事务处理概念与技术》一书的第四章事务模型中,把事务分为:

平板事务(Flat Transactions):事务块中的所有SQL语句,构成一个逻辑单元,要么都成功,要么因之一失败都回滚。PostgreSQL的事务管理如果不考虑保存点(Savepoint)机制,可以认为就是一个平板类型的事务,事务块内的一个SQL失败,导致整个事务必须回滚,之前执行成功的操作也必须回滚掉。

带有保存点的平板事务Flat Transactions With Savepoints):在平板事务的基础上,实现了保存点技术,这样使得一个事务块,可以划分出不同的层次,每个层次之间为一个逻辑单元,后面失败的SQL不影响之前保存点前发生的操作,即回滚发生在局部。PostgreSQLInnoDBInformix在平板事务的基础上,支持了保存点技术。

链式事务(Chained Transactions):与平板事务不同的是,链式事务在提交一个事务后,释放一些资源如锁等资源,但是,一些上下文环境如事务的载体(存放事务信息的结构体或类等对象)不被释放,会留给下一个事务使用。用户感觉自己的逻辑上的处理单元与之前的事务似乎没有COMMIT之类命令执行的明显分割。如InnoDB的事务模型,就是链式事务的代表(这句话不是说InnoDB不支持平板事务,实际上InnoDB支持平板事务、支持带有保存点的平板事务、支持链式事务,并通过XA技术支持下面谈到的分布式事务)。

嵌套事务(Nested Transactions):嵌套事务如同一棵树,树有子叉,每个子叉可以是嵌套的子事务也可以是平板的子事务。但叶子节点的事务是平板事务。根节点事务提交,整个事务的数据修改才生效,否则只是事务内局部有效。PostgreSQLMySQL(不是InnoDBInnoDB是被Oracle收购之后才逐渐并入MySQL的)没有对嵌套事务通过支持。原本MySQL打算在5.0版本之后提供对嵌套事务的支持,但是一直没有兑现。

分布式事务(Nested Transactions):在分布式环境下的平板事务或以上其他类型的事务。

多层次事务(Multi-Level Transactions):多层事务也如同一棵树,树根是事务的总节点,下层是对象操作(Object Operation)作为子事务存在,对象操作还可以带有子对象操作节点,或带有一个或多个的叶子节点(Page operation)。这样的事务模型可以有自己独特的并发控制处理技术[1],现实中有工程实现的不多见,而且与之前的事务分类角度不同。如图1-5,一个简化的两层事务,从叶子节点起为level 0,逐层向上编号。

1-5 多层事务的一个简化版本(两层事务)

    这些不同的模型,在不同数据库中的实现方式是不相同的。尽管每个数据库都遵循相同的原理,但实现各有不同,这点能体现出理论和工程的差异性(有的时候这些差异是有很大鸿沟的),掌握这些差异性,对于数据库内核开发的工程实践人员尤为重要。尤其对于数据库内核的架构设计者,体悟、领会、掌握不同数据库引擎在相同模块的处理方式上的差异,对于指导自身进行设计就更有实战意义。



[1]更多详细信息参见论文《Multi-Node Multi-Level Transactions》。

### Seata 支持的分布式事务模型 #### AT (Automatic Transaction) 模型 AT 模型是一种自动化的分布式事务解决方案,在此模式下,业务 SQL 和数据源被集成在一起处理。在全局事务期间,分支事务会持有锁直到全局事务提交或者回滚完成[^1]。这意味着当执行本地数据库操作时,框架会在后台自动记录前镜像和后镜像,并创建相应的回滚日志。如果全局事务最终决定回滚,则通过这些日志来撤销更改。 #### MT (Manual Transaction) 模型 MT 并不是 Seata 官方定义的一种标准事务传播机制,通常指的是开发者手动管理事务边界的情况。这不属于 Seata 内置的支持类型之一;Seata 主要关注于提供声明式的分布式事务控制能力,而不是让应用程序自己去编写复杂的补偿逻辑或显式地操纵多个资源之间的协调过程。 #### XA 协议 XA 是一种传统的两阶段提交协议,用于跨不同资源管理系统(RMS)之间同步状态变化。虽然 Seata 可以兼容 XA 接口,但是官方更推荐使用其他更加高效灵活的方式来进行分布式事务管理,因为传统 XA 实现往往伴随着性能开销较大等问题。对于大多数场景来说,采用 Seata 自身设计的一套基于消息驱动架构下的柔性事务方案可能是更好的选择。 #### TCC (Try-Confirm-Cancel) 模型 TCC 模型是一类非常典型的柔性事务模式,它要求参与者实现三个接口方法:`try`, `confirm` 和 `cancel`. 在一阶段 (`try`) 中只做预留资源的操作而不真正改变任何持久化存储上的内容;到了第二阶段则根据全局事务的状态分别调用确认(`confirm`) 或取消(`cancel`) 来完成实际的数据更新动作。值得注意的是,在这个过程中一旦 try 成功之后就会立即释放所持有的锁定资源. ```xml <dependencies> <!-- fescar依赖 --> <dependency> <groupId>com.changgou</groupId> <artifactId>changgou_common_fescar</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> ``` 上述 XML 片段展示了如何在一个 Maven 项目里引入 Changgou 提供的一个 Fescar 库版本,该库可能包含了与 Seata 相关的功能组件,以便支持分布式事务特性[^4].
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值