一、概念

并发控制是多个事务在并发运行时,数据库保证事务一致性(Consistency)和隔离性(Isolation)的一种机制。PostgreSQL使用了多版本并发控制技术的一种变体:快照隔离Sanpshot Isolation(简称SI)。通过SI,PostgreSQL提供了四个事务隔离级别,隔离级别从低到高分别是:Read uncommitted 、Read committed 、Repeatable read 、Serializable。在各个隔离级别上被禁止出现的现象是:

  • 脏读:一个事务读取了另一个并行未提交事务写入的数据。
  • 不可重复读:一个事务重新读取之前读取过的数据,发现该数据已经被另一个事务(在初始读之后提交)修改。
  • 幻读:一个事务重新执行一个返回符合一个搜索条件的行集合的查询, 发现满足条件的行集合因为另一个最近提交的事务而发生了改变。
  • 序列化:禁止所有并发异象,效果如同事务以串行的方式执行。

1、Read uncommitted

读未提交,指的就是一个事务可以读取另一个未提交事务的数据。

打个比方:你打算在网上买一台新的电脑,看到一家店中原价6000的电脑,现价只要998,没错,只要998。但是当你开开心心去付款的时候,价格又变成了6000,为啥呢?原来店家老板在输入商品单价的时候(事务开始),不小心按错写成998了,但是事务还没有提交,这时被你看见了,可老板及时发现了不对,马上回滚差点就提交了的事务,将数字改成6000再提交。

小结:商品价格还是原先的6000,但是你却看到了998。这是老板输错了还没提交的数据,这就是脏读。

那怎么解决脏读呢?Read committed!读提交,能解决脏读问题。

2、Read committed

读提交,就是指一个事务要等另一个事务提交后才能读取数据。

打个比方:尽管你发现这台电脑不是998,而是6000,因为你很喜欢,所以咬咬牙还是决定用卡里最后的6000块买下这台电脑。当你开始支付订单时(事务开始),收费系统事先检测到你的卡里有6000块。但是当收费系统准备扣款时,再检测卡里的金额,发现钱不够了。你还在纳闷为啥的时候,你收到一条短信:恭喜您成功续费xxx视频的会员!原来你之前购买的xxx视频的会员在这个时候自动续费了,扣掉了20块,导致你没钱买电脑了(第二次检测金额就是等待会员续费转出金额事务提交完)。

说明:这就是读提交,若有事务对数据进行更新(UPDATE)操作时,读操作事务要等待这个更新操作事务提交后才能读取数据,可以解决脏读问题。但在这个事例中,出现了一个事务范围内两个相同的查询却返回了不同数据,这就是不可重复读。

3、Repeatable read

重复读,就是在开始读取数据(事务开启)时,不再允许修改操作。

举例:你终于等到发工资了,这时你卡里有钱去买电脑了。当你支付订单时(事务开启,不允许其他事务的UPDATE修改操作),收费系统检测到你卡里有6000块,现在不允许其它事务从你的卡里扣钱了,你终于如愿买到新电脑了。

说明:利用重复读终于可以解决不可重复读问题了。但是要注意的是:不可重复读对应的是修改,即UPDATE操作。但是可能还会有幻读问题。因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作。

4、幻读

买完电脑之后,你想看看今天的账单,看看卡里还是多少钱。看到确实是花了6000元,还剩1000块,就在这个时候,你的视频会员又给你自动续费了,即新增INSERT了一条消费记录,并提交。当你打印出自己的账单时,发现卡里980了,怎么少了20块,似乎出现了幻觉,这就是幻读

5、序列化

Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

二、操作

1、查询postgreSQL默认的隔离级别:show default_transaction_isolation;也可以在数据库级别设置默认的隔离级别:#default_transaction_isolation = 'read committed'

2、检查当前隔离级别:show transaction_isolation;

3、修改当前事务的隔离级别,须在事物中执行:set transaction isolation level serializable;

4、修改当前会话默认的隔离级别:set default_transaction_isolation='repeatable read';

PostgreSQL事务隔离级别的更多相关文章

  1. Innodb中的事务隔离级别和锁的关系

    前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式.同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力. ...

  2. Innodb中的事务隔离级别和锁的关系(转)

    原文:http://tech.meituan.com/innodb-lock.html 前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式.同时数据库 ...

  3. Mysql数据库事务隔离级别

    事务(transaction)是数据库管理系统的执行单位,可以是一个数据库操作(如Select操作)或者是一组操作序列.事务ACID属性,即原子性(Atomicity).一致性(Consistency ...

  4. MySQL InnoDB中的事务隔离级别和锁的关系

    前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式.同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力. ...

  5. 【概念原理】四种SQL事务隔离级别和事务ACID特性

    摘要: SQL事务隔离级别和事务的ACID特性 事务是一组读写操作,并且具有只有所有操作都成功才算成功的特性.   事务隔离级别 SQL事务隔离级别由弱到强分别是:READ_UNCOMMITTED.R ...

  6. MySQL数据库引擎、事务隔离级别、锁

    MySQL数据库引擎.事务隔离级别.锁 数据库引擎InnoDB和MyISAM有什么区别 大体区别为: MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISAM类型的表强调的是性能 ...

  7. 重新学习MySQL数据库9:Innodb中的事务隔离级别和锁的关系

    重新学习MySQL数据库9:Innodb中的事务隔离级别和锁的关系 Innodb中的事务隔离级别和锁的关系 前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁 ...

  8. Innodb 中的事务隔离级别和锁的关系

    转自:https://tech.meituan.com/innodb-lock.html 前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式.同时数据 ...

  9. Innodb中的事务隔离级别和锁的关系(转载)

    nodb中的事务隔离级别和锁的关系 原文:https://tech.meituan.com/innodb-lock.html ameng ·2014-08-20 15:50 前言: 我们都知道事务的几 ...

  10. 【转载】Innodb中的事务隔离级别和锁的关系

    前言 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式.同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力.所 ...

随机推荐

  1. 手摸手,使用Dart语言开发后端应用,来吧!

    前言 这几天连续发了几篇关于 Dart 开发后端应用的文章,主要是介绍了 Dart 的一些优点,比如异步任务,并发处理,编译部署等等. 俗话说,光说不练假把式,今天我们来真正开始一个 Dart 后端应 ...

  2. C#中的进程检测退出事件和座位状态改变事件深入浅出谈谈EventHandler的使用

    关于进程 之前我在启动我的师生对讲的exe的时候,都是直接调用Process类的静态函数Process.Start(System.String AppPath,System.String Argume ...

  3. 【爬虫+数据分析+数据可视化】python数据分析全流程《2021胡润百富榜》榜单数据!

    目录 一.爬虫 1.1 爬取目标 1.2 分析页面 1.3 爬虫代码 1.4 结果数据 二.数据分析 2.1 导入库 2.2 数据概况 2.3 可视化分析 2.3.1 财富分布 2.3.2 年龄分布 ...

  4. eclipse打不开maven项目中的pom.xml

    1.问题描述 在eclipse中我双击打开maven项目中的pom.xml报错. 2.产生原因 正如报错中描述的那样"Failed to create the part's controls ...

  5. VuePress个人博客搭建

    vuepress概述 VuePress 由两部分组成:第一部分是一个极简静态网站生成器 (opens new window),它包含由 Vue 驱动的主题系统和插件 API,另一个部分是为书写技术文档 ...

  6. vs code .net core Linux下离线安装Nuget包

    本人第一次使用 vs code在linux下开发.net core项目,由于处于内网,无法通过在线安装,所以在遇见离线安装Nuget包时,耗费了一番功夫,网上也没有相关的,最后还是多个思路结合才解决的 ...

  7. A. Greatest Convex【Codeforces Round #842 (Div. 2)】

    A. Greatest Convex You are given an integer \(k\). Find the largest integer \(x\), where \(1≤x<k\ ...

  8. 《深度探索C++对象模型》第六章 执行期语意学

    new运算符和delete运算符 运算符new看似是一个简单的运算,比如: int *pi=new int(5); 但是它实际由两个步骤完成: 1.通过适当的new运算符函数实体,配置所需的内存: / ...

  9. UOJ60.【UR #5】怎样提高智商

    简要题意 谜题集中有 \(n\) 个谜题,第 \(i\) 个谜题形如: \(i.\) 编号小于 \(i\) 的题目中你选择了几个 \(h_i\)? A. \(a_i\) B. \(b_i\) C. \ ...

  10. 模板层之标签、自定义模板语法、母版(模版)的继承与导入、模型层前期准备知识点、ORM常用关键字

    今日内容概要 模板层之标签 if判断 {% if 条件1 %} #条件1成立 <p>Hello!</p> #执行 {% elif 条件2 %} #条件1不成立 条件2成立 &l ...