• pgsql事务与并发控制


    事务与并发控制

    1. 事务的基本的概念和性质

    ACID:

    • 原子性:一个事务要么全部执行,要么全部不执行

    • 一致性:执行事务的时候,数据库从一个一致的状态变更到另一个状态

    • 隔离性: 确保在并发执行的时候,每个事务感觉不到其他事务在并发的执行

    • 持久性:一个事务完成之后,即使数据库发生故障,他对数据库的改变应该永久的保存在数据库中。

    1. 并发引起的现象

      • 脏读:一个事务读取了第二个事务的已经修改但是未提交的数据

      • 不可重复读:一个事务第一次读取数据之后,被读取的数据被另一个已提交的事务进行了修改,事务再次读取这些数据时候发现数据已经被另外一个事务所修改,两次查询不一致

      • 幻读:一个事务的两次结果集记录数不一致(特殊的不可重复读)

    2. 事务隔离级别

    Pgsql 中默认的为读已提交

    • 读未提交:所有事务可以看到其他未提交的事务的结果

    • 读已提交:一个事务只能看到已经提交事务对关联数据的影响

    • 可重复读:确保同一个事务的多个实例在并发读取数据时候,会看到同样的数据行

    • 可序列化:强制进行事务排序,使得其互不冲突

    1. 查看数据库的隔离级别操作

    • 查看全局事务级别

      select name,setting from pg_settings where name = 'default_transaction_isolation'
    • 修改全局事务隔离级别

      alter system set default_transaction_islation to 'REPEATABLE READ';
      select pg_reload_conf();
      select current_setting('transaction_isolation');
    • 查看当前会话的事务隔离级别

      show transaction_isolcation;
    • 设置当前事务的事务隔离级别

      start transaction isolation level READ UNCOMMITED;
      start TRANSACTION
      select xxxx
      END

    并发控制

    1. 基于锁的并发控制

      1. 排他锁: 被加锁的对象只能被持有锁的事务的读取和修改,其他事务无法在改对象上加其他锁,也不能读取和修改对象

      2. 共享锁:被加锁对象可以被锁事务读取,但是不能修改,其他事务可以在改对象上再加共享锁

      3. 咨询锁(pg特有):

    2. 基于多版本的并发控制

      pgsql默认会加入以下几个字段

      select xmin,xmax,cmin,cmax from test
      1. 以上四个字段保存了创建改行数据的事务xid,xmax保存的是删除改行数据的xid

      • xmin、xmax:与事务对其他事务可见性相关,用于同一个事务可见性判断

      • cmin、cmax:分别为用于插入和删除该原组的时候在十五中的命令序列标识

    3. 判断事务可见性

      • 1 如果xmax没有值,改行对其他事务是可见的

      • 如果他被设置为回滚事务xid,则改行对其他事务也是可见的

      • 如果被设置为一个正在运行时,没有commit和rollback的事务的xid,则改行对其他事务是可见的

      • 如果他被设置为一个已提交的事务的xid,该行在这个已提交的事务之后发起的所有事务都是不可见的

    4. 使用pg_repack解决表膨胀问题

      由于pg采用MVCC读不阻塞写,写不阻塞读,实现高性能和搞吞吐量。。但是也有不足的地方。如果对表进行大量的数据更新,则会导致其有两个版本存在,一个为更新前,一个为更新后,导致其性能有影响。

      pg_repack是一个在线重建表和索引扩展。会在数据库中建立一个和需要清理的目标表一样的临时表,将目标表中的数据复制到临时表。

    安装:

    yum install -y pg_repack10

    创建扩展

    create extension pg_repack

    重建表

    pg_repack -t table_name -j 2 -D -k -h host -u postgres -d dbname

     

  • 相关阅读:
    javascript 图片 滚动加载
    jquery 插件整合在一起的写法
    javascript setInterval createElement
    javascript createDocumentFragment
    javascript 设置元素样式 函数
    javascript 添加元素
    javascript 简单的改变样式的方法
    javascript 原生 左右滚动
    javascript 获取 class和id 的写法
    jquery 动态添加 图片
  • 原文地址:https://www.cnblogs.com/lonecloud/p/9985188.html
Copyright © 2020-2023  润新知