隔离级别
-  iso定义的隔离级别 
 可串行化
 可重复读
 读已提交
 读未提交
-  隔离级别区分的现象 
 脏读: 一个事务读取另一个未提交的事务所做更改
 不可重复度 :同一事务中,前后执行相同的语句,出来的记录不一样
 幻读: 同一事务中,相同的查询出现了新的行记录
-  TiDB支持以下事务隔离级别: 
 Read Commited 和 Repeatable Read。
 悲观事务模式支持: Read Commited 和 Repeatable Read。
设置会话隔离级别
set @@transaction_isolation='read-committed|repeatable-read'
切换事务模式
以乐观模式启动事务
 bigin optimistic
 或者
 set @@tidb_txn_mode = ‘optimistic’
 begin;
在悲观模式下启动事务(默认)
 begin pessimistic;
 或者
 set @@tidb_txn_mode=‘pessimistic’;
 begin;
悲观锁的效果
 谁先开启事务谁先获得锁
 
乐观锁效果
谁先提交谁获得锁
 
 
事务
事务是一个工作单元。它将数据库从一种一致状态变为另一种一致状态。ACID (ATOMIC CONSISTENT ISOLATION DURABLE)
默认情况,TiDB集群在auto commit 模式下运行。
 select @@autocommit;
禁用自动提交
 set autocommit=0;
 begin;
事务控制语句
 start transaction
 begin
 rollback
 set autocommit
隐式commit
 start transaction
 begin
 set autocommit = 1
 权限管理操作,例如 grant,revoke
 ddl
因果一致性的事务
- 会在开始的时候 从PD那获取TSO
- 事务结束的时候 再从PD那获取TSO
- 具有更低的commit延迟
- START TRANSACTION WITCH CAUSAL CONSISTENCY ONLY 则只在事务开始时从PD中获取TSO。 减少了一次PD交互的IO,提升了COMMIT的效率,降低它的延迟。
事务在分布式系统的挑战

改进措施:TCC

 t:try c:commit c:cancel
 这个模型主要考虑第二个,如果上海提交成功,但北京没有提交成功,但由于上海的数据已经持久化,所以北京必须要不停的尝试提交成功,一旦成功后这个事务才算结束。
 
 如果在try阶段就有节点失败,则每个节点都需要回滚,如果某个节点回滚失败,则会不停尝试,直到这个节点回滚成功,则事务才结束
这个最大的问题是:完全由应用程序控制,什么时候try,什么时候cancel 什么时候commt。不是由数据库控制。
改进措施2: SAGA

 长活事务:把大事务拆分成一个个子事务。
 除了做成功的小事务方案,还要有每个小事务的回退方案。
 
 例如发货失败,则SAGA都需要调用回退方案
TiDB采用的方案2PC

 不需要业务结业,由每个分布式数据库的节点控制



















