PostgreSQL (五) 存储过程、视图、触发器、事物管理和并发锁机

news/2024/7/9 20:22:52 标签: postgresql, 存储过程, 视图, 触发器, 事务

1.存储过程

1.1.返回table类型

create or replace function public.function_name(v_id bigint, v_name character varying, v_comment text, v_other_key integer)
returns table(id bigint, name text, comment text, other_key integer)
AS $function$
begin
	return query
	select * from public.table_name;
end;
$function$
language plpgsql;

1.2.返回普通类型

可以是text、double、integer、boolean、void、bigint

create or replace function public.function_name(_key bigint, _qty integer)
returns text
AS $function$
declare   
    num text;
begin 
  --sql 代码
  return '';
end;
$function$
language plpgsql;

2.视图

2.1.作用

  • 将使用的查询定义为视图, 能够简化操作
  • 通过视图, 只能查询他们所能见到的数据, 同时可以通过用户的权限来控制数据的展示, 提高了安全性
  • 数据的独立性

2.2.创建视图

CREATE OR REPLACE VIEW public.view_name
AS SELECT t1.id,
	t1.name,
	t2.comment_info
	FROM table_name1 t1
	left JOIN table_name2 t2 on t1.id = t2.id
	ORDER BY r.id;

2.3.删除视图

drop view if exists public.view_name;

2.4.查询视图

select * from public.view_name where name = 'fracong'

3.触发器

3.1.定义

在数据库执行每个操作之前或者之后, 触发该触发器,从而执行某个函数

3.2.触发器函数

所谓触发器函数, 其实和function(存储过程)是一样的, 唯一的限制是没有参数并且函数的类型是trigger类型.

create function public.function_name()
returns trigger
as $function$
begin
	--sql代码
end;
$function$
language plpgsql;

3.3.触发器

create trigger trigger_name
before|after --执行某个操作之前或者之后触发
insert|update|delete --某个操作
on public.table_name
for each row execute function
public.function_name(); -- 触发器函数

3.4.删除触发器

drop trigger trigger_name on table_name;

4.事务管理

4.1.ACID

  • 原子性Atomic
  • 一致性Consistent
  • 隔离性Isolated
  • 持久性Durable

4.2.常用SQL

  • START TRANSACTION开始新的事务
  • BEGIN 初始化事务
  • COMMIT 提交事务
  • ROLLBACK 事务失败时执行回滚操作
  • SET TRANSACTION 设置事务的特性对后面事务没有影响

4.3.实例

begin;
insert into table_name values(1, 'fracong1', 'test1');
insert into table_name values(2, 'fracong2', 'test2');
insert into table_name values(3, 'fracong3', 'test3');
rollback transaction;
commit;

5.并发锁机

5.1.并发问题

5.1.1.脏读

第一个事务未提交, 第二个事务读取之后, 第一个事务发生回滚, 这时第二个事务读取的数据为脏读.

5.1.2.幻读

第一个事务执行修改或删除操作后未提交, 第二个事务读取的时候并插入数据, 导致第一个事务在查看数据之后,发现部分数据并未被修改.

5.1.3.不可重复性读取

第一个事务和第二个事务同时读取数据, 而第一个事务读取之前修改了数据, 这个时候第二个事务的数据读取为老数据, 而第一个事务读取的是新数据.

5.2.隔离级别

隔离级别脏读幻读不可重复性读取
读未提交
读已提交×
可重复读××
可重复读×××

PostgreSQL只提供两种隔离级别
1.读已提交, PostgreSQL的默认隔离级别.
2.可串行化, 提供最严格的事务隔离.

6.锁机

6.1.锁的类型

6.1.1.自旋锁SpinLock

使用互斥信号, 与操作系统和硬件环境比较密切.主要特点是封锁的时间较短,没有等待队列和死锁检测机制. 事务结束时不能字段释放该锁.

6.1.2.轻量级锁LWLock

提供对共享存储器的数据的互斥访问.特点有等待队列和无死锁检测. 事务结束时, 自动释放该锁.存在排他模式和共享模式.
排他模式: 用于数据的修改, 确保不会同时对同一资源进行多次更新.
共享模式: 用于读取数据. 当事务在读取资源的时候, 允许多个事务进行读取该资源, 但不允许其他事务对该资源进行修改操作.

6.1.3.常规锁RegularLock

一般数据库事务管理中的锁, 有等待队列, 死锁检测和字段释放锁.
1.访问共享锁
2.行共享锁
3.行排他锁
4.共享更新排他锁
5.共享锁
6.共享行排他锁
7.排他锁
8.访问排他锁

6.2.死锁

当两个或多个任务中, 如果每个任务锁定其他任务试图所带的资源, 就会造成这些任务永久堵塞,从而发生死锁, 使得系统处于死锁状态.

6.2.1.原因

如果两个事务锁定当前使用的资源, 同时在申请访问对方锁定的资源, 导致两个资源的锁都不被释放, 形成死锁状态.

6.2.2.减少死锁

1.事务中批处理尽量缩短时间
2.有次序使用资源
3.死锁超时时间设置
4.使用低的隔离级别,减少持有共享锁时间

6.2.3.LOCK命令

1.共享锁

BEGIN;
LOCK TABLE table_name1,table_name2 in SHARE MODE;
SELECT id FROM table_name1 where name = 'name1';
INSERT INTO table_name2 values(_id_, 'name2');
COMMIT;

2.共享行排他锁

BEGIN;
LOCK TABLE table_name1 in SHARE ROW EXCLUSIVE MODE;
DELETE FROM table_name2 WHERE id in (
	SELECT id FROM table_name1 where name ilike '%name%'
);
DELETE FROM table_name1 where name ilike '%name%';
COMMIT;

http://www.niftyadmin.cn/n/250638.html

相关文章

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)

Nacos注册中心 (一)认识和安装Nacos 1、认识Nacos 2、安装nacos 这里下载1.4.1版本 默认端口是8848 下载解压后,终端进入到nacos/bin下,bash startup.sh -m standalone 然后查看start.out文件得到一个网址就可以查看nacos的服…

【python】Python实现网络爬虫demo实例

前言 Python是目前最为流行的爬虫和数据分析编程语言之一,下面将介绍如何使用Python实现网络爬虫。 网络爬虫 Python拥有丰富的网络爬虫库,其中最著名的是爬虫三剑客:requests、BeautifulSoup和Scrapy。 requests是一个HTTP库,…

【C++类和对象】类和对象(中):构造函数 {六个默认成员函数;构造函数的概念及特性;编译器自动生成的构造函数;默认构造函数}

一、类的六个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器…

SpringBoot的创建及配置文件

文章目录:一.Spring项目的创建(1)SpringBoot的含义 (2)SpringBoot的优点 (3)项目目录的运行和介绍 二.SpringBoot的配置文件 (1)配置文件的作用 (2&#xff0…

Faster RCNN系列5——RoI Pooling与全连接层

Faster RCNN系列: Faster RCNN系列1——Anchor生成过程 Faster RCNN系列2——RPN的真值与预测值概述 Faster RCNN系列3——RPN的真值详解与损失值计算 Faster RCNN系列4——生成Proposal与RoI Faster RCNN系列5——RoI Pooling与全连接层 在RPN网络中,已…

《低代码PaaS驱动集团企业数字化创新白皮书》-低代码PaaS应对行业集团企业数字化应用的需求(金融)

低代码PaaS应对行业集团企业数字化应用的需求 金融 金融行业整体处在数字化转型前沿,随着金融与数字技术的深度融合,以客户体验为中心的服务理念的不断深化,伴随其可持续发展模式的不断推进,金融服务形态也发生了根本性变化。然…

十二、详解Kubernetes存储卷的技术原理

Kubernetes存储卷是Kubernetes中用于持久化存储数据的一种抽象概念。它们允许容器在不同的Pod之间共享数据,并且可以在Pod重新调度或迁移时保留数据。本文将详细介绍Kubernetes存储卷的原理。 1.存储卷的概念 Kubernetes存储卷是为了解决容器化环境下数据持久化的问题而引入…

从申请到调用:全国快递物流查询 API 使用教程

引言 面对越来越多的快递需求和快递公司的日益增多,手动查询快递状态的工作变得愈发繁琐。此时,一个全国快递物流查询 API 的出现能够极大地提高查询的效率和准确性,解决人工查询的问题,为用户提供更加便捷的服务体验。全国快递物…