隔离级别

  • 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;

悲观锁的效果

谁先开启事务谁先获得锁

049、事务设计之分布式基本原理_启动事务

乐观锁效果

谁先提交谁获得锁

049、事务设计之分布式基本原理_隔离级别_02


049、事务设计之分布式基本原理_隔离级别_03

事务

事务是一个工作单元。它将数据库从一种一致状态变为另一种一致状态。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的效率,降低它的延迟。

事务在分布式系统的挑战

049、事务设计之分布式基本原理_启动事务_04

改进措施:TCC

049、事务设计之分布式基本原理_分布式_05


t:try c:commit c:cancel

这个模型主要考虑第二个,如果上海提交成功,但北京没有提交成功,但由于上海的数据已经持久化,所以北京必须要不停的尝试提交成功,一旦成功后这个事务才算结束。

049、事务设计之分布式基本原理_数据库_06


如果在try阶段就有节点失败,则每个节点都需要回滚,如果某个节点回滚失败,则会不停尝试,直到这个节点回滚成功,则事务才结束

这个最大的问题是:完全由应用程序控制,什么时候try,什么时候cancel 什么时候commt。不是由数据库控制。

改进措施2: SAGA

049、事务设计之分布式基本原理_回滚_07


长活事务:把大事务拆分成一个个子事务。

除了做成功的小事务方案,还要有每个小事务的回退方案。

049、事务设计之分布式基本原理_启动事务_08


例如发货失败,则SAGA都需要调用回退方案

TiDB采用的方案2PC

049、事务设计之分布式基本原理_回滚_09


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