上一篇文章《分布式事务剖析(一)为什么要学习分布式事务》我们讲解了为什么要学习分布式事务,今天我们第二篇就来讲点基础性的内容-事务。主要讲解两点,事务有哪些特性,
一、事务有哪些特性?
序号 | 特性 | 说明 | 举例说明 |
1 | 原子性 | 事务的原子性指的是构成事务的所有操作要么全部执行完成,要么全部不执行,不可能出现部分执行完成,部分执行失败的情况。 | 在转账的业务中,张三账户有100元,李四账户有100元,张三向李四转账100元,张三账户的余额减少100元,李四的账户增加100元,最终的情况一定是:张三账户有0元,李四账户有200元,或者张三账户有100元,李四账户有100元。即要么全部成功,要么全部失败,不可能张三扣钱成功,李四加钱不成功。 |
2 | 一致性 | 事务的一致性指的是在事务执行之前和事务执行之后,数据始终处于一致性的状态。 | 转账业务中张三向李四转账100元,转账前和转账后的数据必须是正确的,也就是说转账后张三账户的余额会减少100元,李四账户的余额会增加100元,这就是数据的一致性,如果出现了张三账户的余额减少了100元,但是李四的账户没有增加100元,那么这个时候呢就出现了数据的不一致。 |
3 | 隔离性 | 事务的隔离性指的是并发执行的两个事务之间互不干扰,一个事务在执行过程中,不能看到其他事务运行过程的中间状态。 | 比如说还是张三向李四转让的业务场景中,存在两个并发执行的事务A和事务B,事务A执行扣减张三账户余额的操作和增加李四账户余额的操作,事务B执行查询张三账户余额的操作,但是事务A还没有提交完成之前,事务B读取的是张三的账户余额仍然为未扣减之前的账户余额。不能读取到扣减之后的账户余额。 |
4 | 持久性 | 事务的持久性指的是事务提交完成后,次事务对数据的更改操作会被持久化到数据库中,并且不会被回滚。 | 比如说还是张三向李四转账的业务。在同一事物中,执行扣减张三账户余额和增加李四账户余额的操作,只要事务提交完成之后,这种对数据的修改操作就会被持久化到数据库当中,并且呢这种修改是永久的不会回滚。 |
二、事务有哪些类型?
序号 | 类型 | 说明 |
1 | 扁平事务 | 扁平事务是涉及事务操作中最常见,也是最简单和最常用的一种事务。在数据库中,通常使用begin或者start transaction字段开始,由commit或者rollback字段结束。在这之间的所有操作要么全部提交成功,要么全部提交失败(回滚)。当今主流的数据库几乎都支持扁平事务的实现。 |
2 | 带有保存点的扁平事务 | 扁平事务如果在事务内部设置了保存点,就是带有保存点的扁平事务。带有保存点额扁平事务通过在事务内部的某个位置设置savepoint,来达到将当前事务回滚到此位置的目的。 |
3 | 链式事务 | 链式事务是在带有保存点的事务的基础上,自动将当前事务的上下文隐式的传递给下一个事物。也就是说,一个事务的提交操作和下一个事务的开始操作具备原子性,上一个事务的处理结果对下一个事务是可见的。事务与事务之间就像链条一样传递下去。 |
4 | 嵌套事务 | 嵌套事务就是有多个事务处于嵌套状态,共同完成一项任务的处理,整个任务具备原子性。嵌套事务最外层有一个顶层事务,这个顶层事务控制着所有的内部子事务,内部子事务提交完成后,整个事务并不会提交,只有等到最外层的顶层事务提交完成后,整个事务才算提交完成。 |
5 | 分布式事务 | 分布式事务指的是事务的参与者、事务所在的服务器、涉及的资源服务器以及事务管理器等分别位于不同的分布式系统的不同服务或者数据库的节点上。 |
还没有评论,来说两句吧...