详解事务的隔离级别

举报
瘸子那条好腿 发表于 2020/06/12 17:58:37 2020/06/12
【摘要】 http://3ms.huawei.com/km/groups/3088107/blogs/details/5092643

1       简介

事务的隔离级别决定一个事务在同时存在其它并发运行的事务时它能够看到什么数据。在事务中第一个数据修改语句(SELECT, INSERT, DELETE, UPDATE, FETCH, COPY)执行之后,隔离级别就不能再设置。并且在执行 SET TRANSACTION 之前要先执行 START TRANSACTIONBEGIN

SQL 标准用三个必须在并发的事务之间避免的现像定义了四个级别的事务隔离。这些不希望发生的现像是:

(1)脏读 :一个事务读取了另一个未提交事务写入的数据。

(2)不可重复读 :一个事务重新读取前面读取过的数据,发现该数据已经被另

一个已提交事务修改。

(3)幻读 :一个事务重新执行一个查询,返回一套符合查询条件的行,发现这

些行因为其它最近提交的事务而发生了改变。

SQL 事务隔离级别分为:SERIALIZABLE(可串行化)、REPEATABLE READ (可重复读)、READ COMMITTED(读已提交) 、READ UNCOMMITTED(读未提交)。这四种隔离级别对应的行为如下表:

隔离级别

脏读

不可重复读

幻读

读未提交

可能

可能

可能

读已提交

不可能

可能

可能

可重复读

不可能

不可能

可能

可串行化

不可能

不可能

不可能

2       PG 9.2中的隔离级别

该数据库中有SQL定义的四种隔离级别。这四种隔离级别只定义了哪种现像不

能发生,但是没有定义那种现像一定发生。但在PG内部,实际上只有两种独立的隔离级别—读已提交和可串行化。读已提交是 PostgreSQL 里的缺省隔离级别。

2.1      SERIALIZABLE

该级别是最严格。不允许脏读、不可重复读与幻读。SELECT 查询只能看到在事务开始之前已提交的数据而看不到未提交的数据或事务执行期间其它并发事务已提交的修改。不过,SELECT 看得见其自身所在事务中前面尚未提交的更新结果。

下面将该级别对应的行为用例子说明:


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。