从0到1实现分布式事务 -- 认识分布式事务

本节课讲解的主要内容是先介绍与分布式事务相关的一些理论
ACID 隔离级别 spring事务传播行为 乐观锁悲观锁 BASE理论 ACP理论 拜占庭将军问题 共识算法

前言

随着分布式技术的发展,分布式事务问题越来越显著。如何解决分布式事务问题变得非常紧迫。当目前业界较为成熟的分布式事务框架尚不存在,且又因为分布式事务相关的实现原理介绍不够完善,就让我们从今天开始结合原理与实践一起动手去解决分布式事务问题吧。

ACID理论

在解决分布式事务这个问题之前,我们先来回顾一下什么事务,先理解事务的本质,先来看看本地事务的ACID理论。

  • 原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

  • 一致性(Consistency) 一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。

  • 隔离性(Isolation) 事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离

  • 持久性Durability) 这是最好理解的一个特性:持久性,意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。(完成的事务是系统永久的部分,对系统的影响是永久性的,该修改即使出现致命的系统故障也将一直保持)

数据库的隔离级别

  • √为会发生,×为不会发生:
隔离级别 脏读 不可重复读 幻读
read uncommitted(未提交读)
read committed(提交读) x
repeatable read(可重复读 x x
serialization(可串行化) x x x

再总结mysql 的常用命令(下面会用到):
查看MySQL隔离级别: SELECT @@tx_isolation
会话层面设置隔离级别: set session transaction isolation level 隔离级别
开启事务: start transaction
提交事务:commit
回滚事务:rollback

脏读演示

表中的数据如下,设置隔离级别为未提交读

id name balacne
1 张三 1000
2 李四 0

执行流程

时间 客户端A 客户端B
T1 set session transaction isolation level read uncommitted;start transaction(开启事务); update account set balance = balance+1000 where id = 1; select * from account where id = 1; 设置为未提交读,给张三账号+1000,输出为2000  
T2   set session transaction isolation level read uncommitted; start transaction; select * from account where id = 1; 查询余额输出为2000
T3 rollback  
T4  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值