PostgreSQL中事务内Delete/Insert操作的原子性及可见性问题
事务中DELETE全表+INSERT单行的原子性与Read Committed隔离级别下的读取情况
1. 操作是否具备原子性
是的,同一个事务内的DELETE FROM 表名和INSERT INTO 表名 (...) VALUES (...)操作具备原子性。
数据库事务的原子性(Atomicity)保证了事务内的所有操作要么全部成功提交,要么全部回滚。只要这两个操作在同一个事务中执行,就不会出现只完成DELETE未完成INSERT,或者只完成INSERT未完成DELETE的情况——要么最终表中是删除所有行后插入的单行数据,要么回到事务执行前的原始状态。
2. Read Committed隔离级别下是否会出现读取者看到表中有两行的情况
不可能出现由该事务操作导致的“表中有两行”的读取结果,具体原因如下:
- Read Committed是大多数数据库的默认隔离级别,其核心规则是读取只能看到已提交事务的数据,不会看到未提交事务的任何中间修改。
- 在该事务提交前,其他读取者看不到这个事务的DELETE和INSERT操作,只能看到事务执行前的表状态(比如如果原表原本有两行,读取者会看到这两行,但这不是该事务操作后的结果)。
- 当该事务提交后,DELETE和INSERT操作会同时生效,读取者看到的是删除所有行后插入的单行数据,不会看到“删除后空表+新插入行”的中间状态,更不会出现两行的情况。
内容的提问来源于stack exchange,提问作者Maris Orbidans
相关产品推荐
相关产品推荐

