一.什么是事务
事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程 序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用 形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
(1)事务的四大特性
原子性:原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性:事务在完成时,必须是所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性(实例:转账,两个账户余额相加,值不变。)
隔离型:多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数据要相互隔离。
持久性:指一个事务一旦被提交,他对数据库的影响是永久性的。
(2)事务的隔离级别
脏读:就是一个事务可以读取另一个未提交事务的数据。
不可重复读:就是一个事务要等另一个事务提交后才能读取数据。一个事务内多次读取数据,但是两次读取之间有另一个事务执行更新操作,导致同一个事务能两次读取的数据不一致。
幻读取:有两个事务A,B;A事务先对表的数据批量更新操作,B事务对表的插入操作,A在表进行查询操作操作,结果出现了未更新完成的数据。像出现了幻觉一样
Read uncommitted:读未提交。会出现脏读,不可重复读,幻读。
Read committed:读提交。会出现不可重复读,幻读。
Repeatable read :可重复读。会出现幻读。
Serializable :数据库被设计为单线程。可以避免以上所有问题
二.什么是分布式事务
简单点说,分布式事务用于在分布式系统中保证不同节点之间的数据一致。
三.为什么要使用分布式事务
场景:随着互联网发展,大多数互联网公司会将系统进行服务拆分,系统服务化变得越来越流行,客户进行下单操作,客户进行支付,并在订单系统下单成功生成订单,但是需要在行库存服务扣减库存操作,若库存扣减发生异常,如何保证两个系统服务之间的数据一致性?所以分布式事务的使用迫在眉睫
四.分布式事务的理论知识
(1)CAP 理论
C:一致性(Consistency)客户端知道一些了的操作都会同时生效。
A:可用性(Availability)每个操作都必须以可预期的结果相应结束。
P:分区容错性(Partition tolerance)即使出现单个组件无法可用,操作依然可以完成。
cap三者一般很难全部实现,一般会三个中选择两个,cp或者是ap,但是在般互联网公司中一般会牺牲强一致性换取弱一致性,换取高可用性(AP)
xa(全局事务-强一致性)
(2)BASE理论
对cap的一致性和可用性权衡的。核心思想是即使无法做到强一致性,但是每个应用到可以根据自身业务特点,采用适当的方式来使系统最终一致性。
BA:基本可用,在不可抗力的情况下,仍然能够保证‘可用性’,即使一定时间内仍然能够返回一个明确的结果(基本可用和高可用的区别)。
S 柔性状态 同一数据的不同副本状态,可以不需要实时一致。
E 最终一致同一数据的不同副本状态,可以不需要实时一致,但是一定要保证经过一定时间后仍然是一致的。
酸碱平衡
ACID 是酸, Base是碱, 开发场景中对ACID和Base取舍是酸碱平衡
(3)二段式提交(2PC)与三段式(3PC)提交概念
五.分布式事务的实现方式
(1) xa协议
全局事务-强一致性
(2) mq消息的可靠性投递(入下图所示)
(3)2pc 的TCC 的方式实现分布式事务(具体代码示例后期会补充并发布到github)
tcc方式实现分布式事务(try 阶段成功,confirm默认是成功)
try阶段
confirm阶段
cancel阶段
tcc源码框架地址 https://github.com/changmingxie/tcc-transaction
easyTransaction源码框架地址 https://github.com/QNJR-GROUP/EasyTransaction
hmily分布式事务框架地址:https://github.com/Dromara/hmily
(4)全局一致性
在服务器层面实现,比如通过使用阿里云,腾讯云来实现全局一致性