事务是什么?
事务定义:是数据操作的最小工作单元,是作为单个逻辑工作单元执行的一些列操作。这些操作作为一个整体向系统提交,要么都执行,要么都不执行;事务是一组不可分割的操作集合(工作逻辑单元),是访问并可能更新数据库中各种数据项的一个程序执行单元
事务组成:一个数据库事务通常包括对数据库进行 读或 写的一个操作序列(单独的sql语句并不能够称为事务,它必须是一个操作序列,那才能称为事务)
目的:
- 为数据库操作提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性(包括数据一致性,约束一致性)的方法
- 当多个应用程序在并发访问数据库时,可以再这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰
事务的四大特性:
1 、原子性
事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做
2 、一致性
事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。
3 、隔离性
一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
4 、持续性
也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。
什么是分布式事务
我的个人理解是,将原来放进一个表里的东西,由于数据数量变大,不得不将表拆分,导致原来一个事务的功能要在多个表中进行。
出现的问题就是不能保证同步数据,举个例子,A给B汇款,两个人都在同一个表中,那么执行完A减少钱之后紧接着执行B加钱,再使用spring框架下的@Transactional
保证单一数据源增删改的一致性,但是如果你拆开了,那我们的@Transactional
注解就失效了。
这个时候就是分布式事务的关键理论基础,两阶段提交,涉及到的角色有两种,
- 一个事务协调者(coordinator):负责协调多个参与者进行事务投票及提交(回滚)
- 多个事务参与者(participants):即本地事务执行者
总共处理步骤有两个
(1)投票阶段(voting phase):协调者将通知事务参与者准备提交或取消事务,然后进入表决过程。参与者将告知协调者自己的决策:同意(事务参与者本地事务执行成功,但未提交)或取消(本地事务执行故障);
(2)提交阶段(commit phase):收到参与者的通知后,协调者再向参与者发出通知,根据反馈情况决定各参与者是否要提交还是回滚
个人通俗的理解来说:A需要向B进行汇款,A将需要汇款这个钱准备好,然后告诉C,B需要收款,B需要准备好接受的地方,B准备好了,也告诉C,C收到两个准备好了的请求后,执行双方请求。如果任何一个阶段出现异常,C都进行回滚,例如, B告诉C没准备好,那么C将A的请求回滚,将A要用来汇款的钱恢复到要汇款之前的样子。
参考大佬的理解