目录

摘要:

postgres的可重复读说明:

postgres的可重复读的具体操作测试:

一. 开启会话级别的可重复读的隔离级别

修改配置文件postgresql.conf,设置默认的隔离级别:

重新加载配置:

查看默认的隔离级别:

二.  先开启事务A

三. 开启事务B,修改特定行,并提交

四. 在事务A中, 修改同一行,造成可重复读的状态变化,查看postgres的处理

结论:

一. postgres对于可重复读的隔离级别,如果出现读取行的状态变化,则本事务将会提交失败并回滚

二. mysql的可重复读, 如果出现读取行的状态变化,则本事务将会覆盖先前的事务


摘要:

可重复读的隔离级别控制,在postgres和mysql中有不同的处理。

而可重复读,与读已提交,在隔离级别上, 又必须要具体的明白到底有哪些区别。

本文主要记录postgres的可重复读的处理。

postgres的可重复读说明:

可重复读隔离级别只看到在事务开始之前被提交的数据;它从来看不到未提交的数据或者并
行事务在本事务执行期间提交的修改(不过,查询能够看见在它的事务中之前执行的更新,
即使它们还没有被提交)。这是比SQL标准对此隔离级别所要求的更强的保证,并且阻
止表  13.1中描述的除了序列化异常之外的所有现象。如上面所提到的,这是标准特别允许
的,标准只描述了每种隔离级别必须提供的最小保护。
这个级别与读已提交不同之处在于,一个可重复读事务中的查询可以看见在事务中第一个非
事务控制语句开始时的一个快照,而不是事务中当前语句开始时的快照。因此,在一个单
一事务中的后续SELECT命令看到的是相同的数据,即它们看不到其他事务在本事务启动后提
交的修改。
使用这个级别的应用必须准备好由于序列化失败而重试事务。
UPDATE、DELETE、SELECT FOR UPDATE和SELECT FOR SHARE命
令在搜索目标行时的行为和SELECT一样: 它们将只找到在事务开始时已经被提交的
行。 不过,在被找到时,这样的目标行可能已经被其它并发事务更新(或删除或锁住)。
在这种情况下, 可重复读事务将等待第一个更新事务提交或者回滚(如果它还在进行
中)。 如果第一个更新事务回滚,那么它的作用将被忽略并且可重复读事务可以继续更新
最初发现的行。 但是如果第一个更新事务提交(并且实际更新或删除该行,而不是只锁住
它),则可重复读事务将回滚并带有如下消息
ERROR: could not serialize access due to concurrent update
因为一个可重复读事务无法修改或者锁住被其他在可重复读事务开始之后的事务改变的行
当一个应用接收到这个错误消息,它应该中断当前事务并且从开头重试整个事务。在第二次
执行中,该事务将见到作为其初始数据库视图一部分的之前提交的改变,这样在使用行的新
版本作为新事务更新的起点时就不会有逻辑冲突。
注意只有更新事务可能需要被重试;只读事务将永远不会有序列化冲突。
可重复读模式提供了一种严格的保证,在其中每一个事务看到数据库的一个完全稳定的视
图。不过,这个视图并不需要总是和同一级别上并发事务的某些序列化(一次一个)执行保
持一致。例如,即使这个级别上的一个只读事务可能看到一个控制记录被更新,这显示一个
批处理已经被完成但是不能看见作为该批处理的逻辑组成部分的一个细节记录,因为它读取
空值记录的一个较早的版本。如果不小心地使用显式锁来阻塞冲突事务,尝试用运行在这个
隔离级别的事务来强制业务规则不太可能正确地工作。
可重复读隔离级别是使用学术数据库文献和一些其他数据库产品中称为Snapshot
Isolation的已知的技术来实现的。 与使用传统锁技术并降低并发性的系统相比,可以观察
到行为和性能方面的差异。 一些其他系统甚至可以提供可重复读取和快照隔离作为具有不
同行为的不同隔离级别。 直到SQL标准开发出来之后,数据库研究人员才正式确定区分这两
种技术的允许现象,并且超出了本手册的范围。

postgres的可重复读的具体操作测试:

一. 开启会话级别的可重复读的隔离级别

PostgreSQL设置隔离级别 - 潍鲸笔记

修改配置文件postgresql.conf,设置默认的隔离级别:

vim postgresql.conf

default_transaction_isolation = ‘repeatable read’

重新加载配置:

pg_ctl -D /data/pg reload

查看默认的隔离级别:

show default_transaction_isolation;
postgres=# show default_transaction_isolation;
***(Single step mode: verify command)*******************************************
show default_transaction_isolation;
***(press return to proceed or enter x and return to cancel)********************default_transaction_isolation
-------------------------------repeatable read
(1 row)

二.  先开启事务A

务必先开启事务A, 然后在事务A开始后, 再开启事务B。

在事务B中执行完commit提交后, 再在事务A中修改同一行。

事务A操作:

test=# begin;
***(Single step mode: verify command)*******************************************
begin;
***(press return to proceed or enter x and return to cancel)********************BEGIN
test=*# select * from company where id=11;
***(Single step mode: verify command)*******************************************
select * from company where id=11;
***(press return to proceed or enter x and return to cancel)********************id | name | age |                      address                       | salary | join_date
----+------+-----+----------------------------------------------------+--------+------------11 | Paul |  66 | California                                         |  20000 | 2001-07-13
(1 row)test=*# select * from company where id=11;
***(Single step mode: verify command)*******************************************
select * from company where id=11;
***(press return to proceed or enter x and return to cancel)********************id | name | age |                      address                       | salary | join_date
----+------+-----+----------------------------------------------------+--------+------------11 | Paul |  66 | California                                         |  20000 | 2001-07-13
(1 row)test=*# select * from company where id=11;
***(Single step mode: verify command)*******************************************
select * from company where id=11;
***(press return to proceed or enter x and return to cancel)********************id | name | age |                      address                       | salary | join_date
----+------+-----+----------------------------------------------------+--------+------------11 | Paul |  66 | California                                         |  20000 | 2001-07-13
(1 row)

三. 开启事务B,修改特定行,并提交

test=# begin;
***(Single step mode: verify command)*******************************************
begin;
***(press return to proceed or enter x and return to cancel)********************BEGIN
test=*#
test=*# select * from company where id=11;
***(Single step mode: verify command)*******************************************
select * from company where id=11;
***(press return to proceed or enter x and return to cancel)********************id | name | age |                      address                       | salary | join_date
----+------+-----+----------------------------------------------------+--------+------------11 | Paul |  66 | California                                         |  20000 | 2001-07-13
(1 row)test=*# update company set age=88 where id=11;
***(Single step mode: verify command)*******************************************
update company set age=88 where id=11;
***(press return to proceed or enter x and return to cancel)********************UPDATE 1
test=*# select * from company where id=11;
***(Single step mode: verify command)*******************************************
select * from company where id=11;
***(press return to proceed or enter x and return to cancel)********************id | name | age |                      address                       | salary | join_date
----+------+-----+----------------------------------------------------+--------+------------11 | Paul |  88 | California                                         |  20000 | 2001-07-13
(1 row)test=*# commit;
***(Single step mode: verify command)*******************************************
commit;
***(press return to proceed or enter x and return to cancel)********************

四. 在事务A中, 修改同一行,造成可重复读的状态变化,查看postgres的处理

test=*# update company set age=99 where id=11;
***(Single step mode: verify command)*******************************************
update company set age=99 where id=11;
***(press return to proceed or enter x and return to cancel)********************2022-05-24 12:50:53.649 EDT [443682] ERROR:  could not serialize access due to concurrent update
2022-05-24 12:50:53.649 EDT [443682] STATEMENT:  update company set age=99 where id=11;
ERROR:  could not serialize access due to concurrent update

结论:

一. postgres对于可重复读的隔离级别,如果出现读取行的状态变化,则本事务将会提交失败并回滚

二. mysql的可重复读, 如果出现读取行的状态变化,则本事务将会覆盖先前的事务

2022-05-25 postgres中的并发控制的可重复读相关推荐

  1. 浅析Postgres中的并发控制(Concurrency Control)与事务特性(上)

    转载:https://www.cnblogs.com/flying-tiger/p/9567213.html#4121483#undefined PostgreSQL为开发者提供了一组丰富的工具来管理 ...

  2. SQL中的脏读、不可重复读、幻读

    一.数据库事务隔离级别 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted .Read committed .Repeatable read .Serializable ,这四 ...

  3. MySQL MVCC多版本并发控制(脏读和不可重复读解决原理)

    文章目录 一.MVCC概念 二.MVCC应用于已提交读隔离级别 1. 解决脏读 2. 无法解决不可重复读 3. 无法解决幻读 三.MVCC应用于可重复读隔离级别 1. 解决脏读 2. 解决不可重复读 ...

  4. 【SRE笔记 2022.8.25 linux用户组及用户命令】

    [SRE笔记 2022.8.25] 密码修改 passwd 批量修改 chpasswd 拓展 env 显示环境变量 查看和更改密码属性 chage 参数-l 参数-E 设定账户过期时间,类似usera ...

  5. 2022.5.25 FreeSurfer入门练习:Recon-all

    2022.5.25 FreeSurfer入门练习:Recon-all 参考资料:https://andysbrainbook.readthedocs.io/en/latest/FreeSurfer/F ...

  6. 【阅读材料精选 From-to-Date:2019.05.25~2019.06.28】

    [阅读材料精选 From-to-Date:2019.05.25~2019.06.28] 重点内容 [文本数据集] github:https://github.com/imhuster/funNLP [ ...

  7. 每日总结(2022/05/17-)

    2022/05/17- 线程配置 实验设备 实现2个矩阵(Width=2048, Height=1024)的相加,输入的矩阵A,B按照以下要求初始化,矩阵A的初始值全为本人学号的最后1位数字,矩阵B的 ...

  8. 硬件大熊原创合集(2022/05更新)

    2022/05月份更新的篇章 NFC之华为AIPASS认证:测试系统简介 NFC之华为AIPASS认证:测试用例简介 智能门锁:人脸识别技术 清晰认知事物概念 传统的职业坐标体系中,个体依赖于工作本身 ...

  9. 前端js调用后端API获取数据的三种方法(2022.7.25)

    前端js调用后台API获取数据的三种方法(2022.7.25) 前言 需求分析 一个Get实例 浏览器请求 SoapUI软件请求 一个Post实例 浏览器请求 SoapUI软件请求 1.Http简介( ...

最新文章

  1. 【转载】关于RabbitMQ的消息确认
  2. linux xz 解压initrd.img,2016-8-28 linux基础学习——压缩解压缩及归档 while脚本
  3. java静态变量和实例变量的区别6_java静态变量的与实例变量的区别
  4. js中bind、call、apply函数的用法
  5. 为什么说去中心化很重要
  6. ffmpeg rtp传输使用
  7. Linux多线程工作笔记0003---C语言中%p,%u,%lu都有什么用处
  8. Windows Phone 7 常用控件简介
  9. Flink1.6系列之—数据流编程模型
  10. SPSS常用方法及操作
  11. 企业微信hook,企业微信软件
  12. ssm高仿bilibili视频网站
  13. 工业机器人——机械手臂
  14. html5如何添加图片菜鸟教程,菜鸟入门教程 HTML5的常见用法
  15. 汉诺塔问题(非常简单明了的解析)
  16. 三种方法绘制单位圆-R语言
  17. 尺寸公差分析尺寸链计算软件:DTAS3D电机气隙案例
  18. 深入理解Java虚拟机到底是什么
  19. 病案编码员需要计算机的什么知识,病案编码员要怎么学习?
  20. linux第一块ide硬盘命名为,linux下硬盘分区

热门文章

  1. mingw64亲测有效版本,直接解压,无需安装
  2. 蓝牙规范-Vol 6:低功耗控制器 Part A 物理层规范
  3. Wide Deep Learning for Recommender Systems【论文记录】
  4. Flask框架详细教程
  5. python程序设计与算法基础江红答案_《Python程序设计与算法基础教程(第二版)》江红 余青松,第十一章课后习题答案...
  6. 他是国家的儿子 如不再优秀请原谅他
  7. numpy/pandas 10min了解pandas
  8. java新手知识第二周
  9. Matlab相机标定可能遇到的报错
  10. 电子商务格局下的营销未来