diva-notes
  • README
  • Ads
    • 定价策略
    • 广告层级
    • 归因模型
    • 买量
    • Chat GPT
    • Google
  • AI
    • 参考资料
    • Chat GPT
    • stable-diffusion-webui安装
  • Algorithm
    • 倍增
    • 并查集
    • 参考
    • 环的判断
    • 凸包
    • 蓄水池抽样
    • 最短路径
    • 最小生成树
    • KMP算法
    • Rabin-Karp算法
    • Tarjan桥算法
  • Architecture
    • Serverless
  • Career
  • CICD
    • 代码质量
    • CICD实践
  • Data Structure
    • 布谷鸟过滤器
    • 布隆过滤器
    • 浮点
    • 红黑树
    • 锁
    • LSM树
  • DB
    • My SQL
      • 隔离级别
      • 架构
      • 索引
      • 锁
      • 页结构
      • 主从同步
      • ACID
      • Log
      • MVCC
      • Questions
    • Postgres
      • 持久化
      • 对比MySQL
      • 隔离级别
      • 索引
      • Greenpulm
      • MVCC
    • 倒排索引
    • 列式存储
    • H Base
    • HDFS
    • MPP数据库选型
    • Questions
  • Distributed System
    • 分布式事务
    • 服务网格
    • BASE理论
    • CAP
    • Etcd
    • Raft协议
    • ZAB协议
  • Go
    • 1.语言基础
      • 1.CPU寄存器
      • 2-1.函数调用
      • 2-2.函数调用栈
      • 2.接口
      • 3.汇编
      • 4.调试
    • 2.编译
      • 1.编译
      • 2.词法与语法分析
      • 3.类型检查
      • 4.中间代码生成
      • 5.机器码生成
    • 3.数据结构
      • 1.数组array
      • 2.切片slice
      • 3.哈希表map
      • 4.字符串
    • 4.常用关键字
      • 1.循环
      • 2.defer
      • 3.panic和recover
      • 4.make和new
    • 5.并发编程
      • 1.上下文Context的实现
      • 2-1.runtime.sema信号量
      • 2-2.sync.Mutex的实现
      • 2-3.sync.WaitGroup
      • 2-4.sync.Once的实现
      • 2-5.sync.Map的实现
      • 2-6.sync.Cond
      • 2-7.sync.Pool的实现
      • 2-8.sync.Semaphore的实现
      • 2-9.sync.ErrGroup
      • 3.定时器Timer的实现
      • 4.Channel的实现
      • 5-1.调度-线程
      • 5-2.调度-MPG
      • 5-3.调度-程序及调度启动
      • 5-4.调度-调度策略
      • 5-5.调度-抢占
      • 6.netpoll实现
      • 7.atomic
    • 6.内存管理
      • 1-1.内存分配基础-TCmalloc
      • 1-2.内存分配
      • 2.垃圾回收
      • 3.栈内存管理
    • 参考
    • 各版本特性
    • 坑
    • Go程序性能优化
    • http.Client
    • net.http路由
    • profile采样的实现
    • Questions
    • time的设计
  • Kafka
    • 高可用
    • 架构
    • 消息队列选型
    • ISR
    • Questions
  • Network
    • ARP
    • DNS
    • DPVS
    • GET和POST
    • HTTP 2
    • HTTP 3
    • HTTPS
    • LVS的转发模式
    • NAT
    • Nginx
    • OSI七层模型
    • Protobuf
    • Questions
    • REST Ful
    • RPC
    • socket缓冲区
    • socket详解
    • TCP滑动窗口
    • TCP连接建立源码
    • TCP连接四元组
    • TCP三次握手
    • TCP数据结构
    • TCP四次挥手
    • TCP拥塞控制
    • TCP重传机制
    • UDP
  • OS
    • 磁盘IO
    • 调度
    • 进程VS线程
    • 零拷贝
    • 内存-虚拟内存
    • 内存分配
    • 用户态VS内核态
    • 中断
    • COW写时复制
    • IO多路复用
    • Questions
  • Redis
    • 安装
    • 参考
    • 高可用-持久化
    • 高可用-主从同步
    • 高可用-Cluster
    • 高可用-Sentinel
    • 缓存一致性
    • 事务
    • 数据结构-SDS
    • 数据结构-Skiplist
    • 数据结构-Ziplist
    • 数据结构
    • 数据类型-Hashtable
    • 数据类型-List
    • 数据类型-Set
    • 数据类型-Zset
    • 数据淘汰机制
    • 通信协议-RESP
    • Questions
    • Redis6.0多线程
    • Redis分布式锁
    • Redis分片
  • System Design
    • 本地缓存
    • 错误处理
    • 大文件处理
    • 点赞收藏关注
    • 短链接生成系统
    • 负载均衡
    • 高并发高可用
    • 规则引擎
    • 集卡活动
    • 秒杀系统
    • 评论系统
    • 熔断
    • 限流
    • 延迟队列
    • Docker
    • ES
    • K 8 S
    • Node.js
    • Questions
  • Work
    • Bash
    • Charles
    • Code Review
    • Ffmpeg
    • Git
    • intellij插件
    • I Term 2
    • Mac
    • mysql命令
    • Nginx
    • postgresql命令
    • Protoc
    • Ssh
    • Systemd
    • Tcp相关命令
    • Vim
Powered by GitBook
On this page
  • ANSI SQL标准隔离级别
  • PostgreSQL隔离级别
  1. DB
  2. Postgres

隔离级别

ANSI SQL标准隔离级别

ANSI SQL标准通过现象(Phenomena)定义(除此之外还可以通过锁、数据流图定义),下面首先使用形式化语言来定义以下几种现象:

脏写 P0 – (Dirty Write)

脏读 P1 – Dirty Read

不可重复读 P2 – Fuzzy or Non-Repeatable Read

幻读P3 – Phantom

ANSI SQL标准通过禁止上述现象的形式定义了四个隔离级别,分别是读未提交、读已提交、可重复读和可串行化:

隔离级别
P0 Dirty Write
P1 Dirty Read
P2 Fuzzy Read
P3 Phantom

Read Uncommitted

Not Possible

Possible

Possible

Possible

Read Committed

Not Possible

Not Possible

Possible

Possible

Repeatable Read

Not Possible

Not Possible

Not Possible

Possible

Serializable

Not Possible

Not Possible

Not Possible

Not Possible

读未提交:禁止脏写

读已提交:禁止脏读和脏写

可重复读:除幻读外,禁止其他现象

可串行化:禁止所有并发现象,效果如同事务以串行的方式执行

PostgreSQL隔离级别

PostgreSQ L 与ANSI SQL标准相应,也定义了四种隔离级别。但由于使用了快照读 SI(Snapshot Isolation) ,RU 和 RC 实际上在 PostgreSQL 中没有任何区别。

并且得益于快照读, RR 级别下也没有幻读问题。RR 级别下连 \d 命令都看不到别的事务对表结构的修改。

但 RR 级别下可能产生阻塞、串行化失败等问题。比如

## course表, (name text, score int), name为唯一键
## 插入主键冲突的数据会导致阻塞

## 事务1
> BEGIN;
> INSERT INTO course(name, score) VALUES ('go',  0);

## 事务2
> INSERT INTO course(name, score) VALUES ('go',  1);
## 事务2会卡住,无法再输入COMMIT命令,等事务1 COMMIT时事务2会报错

## 事务1
> COMMIT;
INSERT 0 1

## 事务2会报错,只能ROLLBACK
ERROR:  duplicate key value violates unique constraint "course_name_idx"
DETAIL:  Key (name)=(math) already exists.
> COMMIT;
ROLLBACK

再比如对同一行数据进行修改,会报串行失败的错:

## 事务1
> BEGIN;
> UPDATE course SET score=score+1 WHERE id=1;

## 事务2
> BEGIN;
> UPDATE course SET score=score+1 WHERE id=1;
ERROR:  could not serialize access due to concurrent update

在 RC 级别下,这种操作则会导致阻塞。这种情况可以用 SELECT FOR UPDATE 语法解决。

# 事务1
BEGIN; 
UPDATE course SET score=1 WHERE id = (SELECT id FROM course WHERE id=1 FOR UPDATE);

# 事务2
BEGIN; 
UPDATE course SET score=1 WHERE id = (SELECT id FROM course WHERE id=1 FOR UPDATE SKIP LOCKED);

其中事务2的 SKIP LOCKED 会因事务1上锁而 SELECT 不出任何数据,直接跳过更新。

因此 PostgreSQL 仍然提供 Serialzable 级别。

Previous对比MySQLNext索引

Last updated 3 years ago