隔离级别
- 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
不需要业务结业,由每个分布式数据库的节点控制