详解事务的隔离级别
1 简介
事务的隔离级别决定一个事务在同时存在其它并发运行的事务时它能够看到什么数据。在事务中第一个数据修改语句(SELECT, INSERT, DELETE, UPDATE, FETCH, COPY)执行之后,隔离级别就不能再设置。并且在执行 SET TRANSACTION 之前要先执行 START TRANSACTION 或 BEGIN 。
SQL 标准用三个必须在并发的事务之间避免的现像定义了四个级别的事务隔离。这些不希望发生的现像是:
(1)脏读 :一个事务读取了另一个未提交事务写入的数据。
(2)不可重复读 :一个事务重新读取前面读取过的数据,发现该数据已经被另
一个已提交事务修改。
(3)幻读 :一个事务重新执行一个查询,返回一套符合查询条件的行,发现这
些行因为其它最近提交的事务而发生了改变。
SQL 事务隔离级别分为:SERIALIZABLE(可串行化)、REPEATABLE READ (可重复读)、READ COMMITTED(读已提交) 、READ UNCOMMITTED(读未提交)。这四种隔离级别对应的行为如下表:
隔离级别 |
脏读 |
不可重复读 |
幻读 |
读未提交 |
可能 |
可能 |
可能 |
读已提交 |
不可能 |
可能 |
可能 |
可重复读 |
不可能 |
不可能 |
可能 |
可串行化 |
不可能 |
不可能 |
不可能 |
2 PG 9.2中的隔离级别
该数据库中有SQL定义的四种隔离级别。这四种隔离级别只定义了哪种现像不
能发生,但是没有定义那种现像一定发生。但在PG内部,实际上只有两种独立的隔离级别—读已提交和可串行化。读已提交是 PostgreSQL 里的缺省隔离级别。
2.1 SERIALIZABLE
该级别是最严格。不允许脏读、不可重复读与幻读。SELECT 查询只能看到在事务开始之前已提交的数据而看不到未提交的数据或事务执行期间其它并发事务已提交的修改。不过,SELECT 看得见其自身所在事务中前面尚未提交的更新结果。
下面将该级别对应的行为用例子说明:
- 点赞
- 收藏
- 关注作者
评论(0)