首页 > 数据库 >PostgreSQL中的事务隔离级别

PostgreSQL中的事务隔离级别

时间:2023-12-19 21:12:15浏览次数:47  
标签:事务 PostgreSQL 隔离 Alice T1 提交 级别 读取

PostgreSQL中的事务隔离级别在确保多用户数据库环境中的数据一致性、完整性和并发控制方面起着至关重要的作用。当多个事务并发执行时,隔离级别定义了它们之间的相互隔离的程度。PostgreSQL提供了一系列的隔离级别,每个级别都有自己的一套保证和权衡,允许开发人员根据特定的需求定制应用程序的行为。

隔离级别规定事务如何观察其他事务所做的更改,以及它们如何保护数据不受并发修改的影响。它们可以防止常见的问题,如脏读(读取未提交的数据)、不可重复读(多次读取之间发生更改的数据)和幻读(看到其他事务插入的新行)。

隔离级别 脏读 不可重复读 幻读 序列化异常
读未提交 允许,但不在 PG 中 可能 可能 可能
读已提交 不可能 可能 可能 可能
可重复读 不可能 不可能 允许,但不在 PG 中 可能
可序列化 不可能 不可能 不可能 不可能

SQL 标准定义了四种隔离级别,但是postgreSQL只实现了三种不同的隔离级别,即 PostgreSQL 的读未提交模式的行为和读已提交相同。

  • 脏读

    当一个事务读取已被另一个事务修改的数据,但修改的事务尚未提交时。这可能导致不一致和不正确的结果。

    | AccountNumber | AccountHolder | Balance |
    |---------------|---------------|---------|
    | 1001          | Alice         | $100    |
    | 1002          | Bob           | $150    |
    

    事务1:

    1. 事务开始。
    2. 读取账号1001 (Alice的账户)的当前余额为100美元。

    事务2:

    1. 事务开始。
    2. 将账号1001的余额更新为200美元(增加Alice的余额)。

    回到事务1:

    1. 读取帐号1001的余额得到$200(脏读)。
    2. 根据读余额执行计算,并从中扣除50美元。

    事务2:

    1. 提交事务,账号1001的余额更新为200美元。

    在这个例子中,事务1 (T1)执行了一次脏读。它在事务2 (T2)提交其更改之前读取Alice的账户余额。结果,T1根据脏读数进行了计算,从不准确的200美元余额中扣除了50美元。一旦T2提交了它的更改,正确的余额变成了200美元,但是T1的计算已经基于不正确的脏读值。

  • 不可重复读

    当一个事务读取数据值时,另一个事务修改或更新该值并提交更改。当第一个事务试图再次读取相同的值时,它会遇到与最初读取的值不同的值。这种不一致可能导致意外行为和数据完整性问题。

    | StudentID | Name   | Age |
    |-----------|--------|-----|
    | 1         | Alice  | 20  |
    | 2         | Bob    | 22  |
    

    事务1:

    1. 事务开始
    2. 读取ID为1 (Alice)的学生的年龄为20。

    事务2:

    1. 事务开始。
    2. 将ID为1 (Alice)的学生的年龄更新为21岁。
    3. 提交事务。

    回到事务1:

    1. 再次读取ID为1 (Alice)的学生的年龄,并获得更新后的值21。

    这个例子中,不可重复读取现象发生在事务1 (T1)中。当T1初始读取Alice (ID为1的学生)的年龄时,得到的值为20。然而,当T1仍然处于活动状态时,事务2 (T2)将Alice的年龄修改为21岁并提交了更改。当T1再次读取Alice的年龄时,它遇到的是更新后的21,而不是原来的20。

  • 幻读

    当某个事务根据某个条件检索一组行,另一个事务插入、更新或删除符合该条件的行。此时,当第一个事务重新执行相同的查询时,它会观察到一组不同的行,就好像在两次执行之间“出现”或“消失”了新行一样。

    | ProductID | ProductName  | Price |
    |-----------|--------------|-------|
    | 1         | Laptop       | $800  |
    | 2         | Smartphone   | $400  |
    

    事务1:

    1. 事务开始。
    2. 执行一个查询来检索价格小于$500的所有产品。

    事务2:

    1. 事务开始。
    2. 插入一个新产品,ProductID为3,ProductName为“Tablet”,价格为350美元。
    3. 提交事务。

    回到事务1:

    1. 重新执行相同的查询来检索价格小于$500的产品。然而,这次它返回两行。

    在本例中,当事务1 (T1)在第二次执行同一查询时遇到一组不同的行时,就会出现幻读现象。这是因为事务2 (T2)在T1的两次执行之间插入了与T1的查询条件(“Tablet”,价格为350美元)匹配的新行。结果,T1得到一个不知道从哪里冒出来的记录。

标签:事务,PostgreSQL,隔离,Alice,T1,提交,级别,读取
From: https://www.cnblogs.com/rezero/p/17914727.html

相关文章

  • Shadow DOM处理html渲染,样式隔离
    参考文章https://cloud.tencent.com/developer/article/1965869handleDetailData(){this.content=`<style>${markdown.style}</style>${this.content}`;//使用示例constcontainerElement=docume......
  • Postgresql中PL/pgSQL代码块的语法与使用-声明与赋值、IF语句、CASE语句、循环语句
    场景PostGresSQL简介与Windows上的安装教程:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/113981563除了标准SQL语句之外,PostgreSQL还支持使用各种过程语言(例如PL/pgSQL、C、PL/Tcl、PL/Python、PL/Perl、PL/Java等)创建复杂的过程和函数,称为存储过程(Store......
  • Postgresql中自增主键序列的使用以及数据传输时提示:错误:关系"xxx_xx_xx_seq"不存在
    场景Postgresql在Windows中使用pg_dump实现数据库(指定表)的导出与导入:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/135011801上面讲使用pg_dump进行postgresql的导出与导入。如果使用Navicat可以直接连接两个库,则可直接使用数据传输功能。但是在传输某个表......
  • 记一次postgresql数据库插入记录失败的问题。。。
    代码在测试环境中运行了一段时间,之前都没有问题,突然pg数据库中的某个表不能插入记录了,具体来说是新插入的主键与表中已有记录的主键重复导致入库失败,但是主键设置的是自增策略,理论上说,不会重复。网上看到有人说需要设置下该表主键对应序列的下一个值。查看表的数据定义语句如下......
  • PostgreSQL PG_DUMP 工作失败了怎么回事及如何处理
    最近群里有同学问关于pg_dump失败的问题,但是最近老眼昏花脑子搭错线,看成mysqldump还傻傻的问人家mysql那个版本。所以基于这个pg_dump的问题的写一篇,pgdump对比mysqldump来说,的确从功能性和性能方面要比mysql给的逻辑备份的方式要好的多,这里我们可以稍微浅浅的比较一下1 pg_dum......
  • ROW_NUMBER 开窗函数优化方案(Oracle && PostgreSQL 性能比对)
    帮朋友优化一条很简单的窗口函数ROW_NUMBER()OVER(),Oracle迁移PostgreSQL项目。原始SQL和执行计划STUDENT_BAK表我模拟的数据,3千万行数据。SELECTSTU_ID,STU_NAME,STU_SEX,STU_AGE,STU_DATE,STU_CLASSID,STU_SALFROM(SELECTSB.*, ROW_NUMBER()OVER(P......
  • Linux服务器快速安装PostgreSQL15以及pgvector向量插件
    最近开始体验FastGPT或Dify等开源知识库问答系统,用他们试着开发调试一些小助手。这中间需要使用到PostgreSQL,就在自己服务器上进行了安装,特此记录下。环境说明:阿里云ECS,2核8G,X86架构,CentOS7.9操作系统。选择版本1.打开PostgreSQL官网下载页面,选择操作系统和数据库版本。我本......
  • Linux服务器快速安装PostgreSQL15以及pgvector向量插件
    最近开始体验FastGPT或Dify等开源知识库问答系统,用他们试着开发调试一些小助手。这中间需要使用到PostgreSQL,就在自己服务器上进行了安装,特此记录下。环境说明:阿里云ECS,2核8G,X86架构,CentOS7.9操作系统。选择版本1.打开PostgreSQL官网下载页面,选择操作系统和数据库版本。我本机......
  • 产学研三界顶级大咖分享:RISC-V场景Show暨开源生态高级别论坛定档12/19
    12月19日,RISC-V场景Show暨开源生态高级别论坛即将开幕。本次论坛将邀请来自中科院计算技术研究所副所长包云岗、嘉楠科技AI软件总监张晓晶、阿里巴巴达摩院生态总监陈炜、清华大学长聘副教授陈渝和中科院软件研究所高级工程师于佳耕出席,现场为大家分享新一轮处理器技术突破、RISC-V......
  • 产学研三界顶级大咖分享:RISC-V场景Show暨开源生态高级别论坛定档12/19
    12月19日,RISC-V场景Show暨开源生态高级别论坛即将开幕。本次论坛将邀请来自中科院计算技术研究所副所长包云岗、嘉楠科技AI软件总监张晓晶、阿里巴巴达摩院生态总监陈炜、清华大学长聘副教授陈渝和中科院软件研究所高级工程师于佳耕出席,现场为大家分享新一轮处理器技术突破、RISC-......