本节课讲解的主要内容是先介绍与分布式事务相关的一些理论
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 |