[SQL系列] 从头开始学PostgreSQL 事务 锁 子查询

[SQL系列] 从头开始学PostgreSQL 索引 修改 视图_Edward.W的博客-CSDN博客https://blog.csdn.net/u013379032/article/details/131818865

事务

        事务是一系列逻辑相关的数据库操作,可以作为一个整体进行操作或者回滚。事务通常会包含一个序列的读或者写操作,通过提交给数据库管理系统,从而保证事务操作完成并且永久保存在数据库中。如果没有操作完成,则整个事务都会回滚,不会造成其他影响。

属性

        我们日常所说的ACID指的就是它的属性:

        1. 原子性 (Atomicity):事务中的所有操作在提交或回滚时都是作为一个整体进行的,不会中途停止或被中断。这意味着事务中的每个操作都会被完全执行,要么全部成功,要么全部失败。
        2. 一致性 (Consistency):事务在执行过程中必须保持数据一致性。这意味着在事务开始之前和结束之后,数据都必须处于一致状态。在事务执行过程中,如果数据发生了变化,那么这些变化必须在事务结束时被正确地应用到数据库中。
        3. 隔离性 (Isolation):事务的执行不能被其他事务干扰。这意味着在事务执行期间,其他事务无法访问事务所使用的数据或资源,从而避免了并发执行时的数据冲突和脏读等问题。
        4. 持久性 (Durability):事务的执行结果必须永久地保存在数据库中。这意味着即使在事务提交之后,事务的结果也不能被丢失或更改。

控制

        在PostgreSQL中,事务是通过Begin、Commit和Rollback命令用来创建,提交和回滚。EGIN 命令用于开始一个新的事务,COMMIT 命令用于提交当前的事务,ROLLBACK 命令用于回滚当前的事务。在事务期间,可以执行各种数据库操作,例如插入、更新、删除数据,查询数据等等。

通过begin  和   commit来标记一整个事务,中间是事务的具体操作命令。

BEGIN;  
SELECT id FROM users WHERE username = 'john';  
INSERT INTO orders (user_id, product, quantity, price)   
VALUES (1, 'apple', 2, 2.50);  
INSERT INTO orders (user_id, product, quantity, price)   
VALUES (1, 'orange', 1, 1.50);  
COMMIT;  

Commit命令可以把事务调用的更改保存到数据库中,也作为一整个事务的结尾。

而当我们提交了错误的事务的时候,可以通过rollback撤销尚未保存到数据库的事务命令。 

BEGIN;DELETE FROM ORDERS WHERE quality = 1;ROLLBACK;

        数据库中,锁的存在是为了保证数据库的一致性,在并发较高的数据库中,可以避免同时修改表产生的冲突。

一般来讲,有两种基本的锁:排它锁和共享锁。

如果数据对象加上了排他锁,那么其他的事务既不能读也不能修改它。

如果数据对象加上了共享锁,那么该对象可以被读,但是不能被修改。

还有更细粒度的行级锁:

1. 行共享锁,用于Select ... for update语句,允许多个并发事务访问同一行数据,但是只有一个事务可以更新该行数据。

2. 行独占锁,用于insert, update和delete语句,在事务完成前,其他事务无法访问该行数据

示例:

#共享锁
testdb=# begin;
BEGIN
testdb=*# lock table students in access share mode;
LOCK TABLE
testdb=*# commit;
COMMIT
#独占锁testdb=# begin;
BEGIN
testdb=*# lock table students in access exclusive mode;
LOCK TABLE
testdb=*# commit;
COMMIT

锁必须加在事务中,不能随随便便的就写了lock,否决则会报错。

子查询

        子查询就是一种嵌套在另一个查询中的查询,反应会一个结果集,用于主查询中的条件或者数据比对。

        子查询还可以嵌套多层,用于实现复杂数据操作和数据过滤,从而提高查询效率和减少数据冗余。

举个例子:

#原始表格
testdb=# select * from engineer;id | name  | age | gender |    address    |     created_at      
----+-------+-----+--------+---------------+---------------------1 | John  |  30 | M      | New York      | 2023-02-18 10:00:002 | Mary  |  25 | F      | Los Angeles   | 2023-02-18 10:00:003 | Peter |  35 | M      | Chicago       | 2023-02-18 10:00:004 | Jane  |  28 | F      | San Francisco | 2023-02-18 10:00:005 | Bob   |  40 | M      | Boston        | 2023-02-18 10:00:006 |       |     | F      | Washington DC | 2023-02-18 10:00:007 |       |     | M      | Atlanta       | 2023-02-18 10:00:008 |       |     | F      | Miami         | 2023-02-18 10:00:009 |       |     | M      | Philadelphia  | 2023-02-18 10:00:0010 |       |     | F      | Dallas        | 2023-02-18 10:00:00
(10 rows)#经过了子查询的表格,子查询筛选了所有gender是'M'的,主查询将它都输出来
testdb=# select * from engineer where id in (select id from engineer where gender = 'M');id | name  | age | gender |   address    |     created_at      
----+-------+-----+--------+--------------+---------------------1 | John  |  30 | M      | New York     | 2023-02-18 10:00:003 | Peter |  35 | M      | Chicago      | 2023-02-18 10:00:005 | Bob   |  40 | M      | Boston       | 2023-02-18 10:00:007 |       |     | M      | Atlanta      | 2023-02-18 10:00:009 |       |     | M      | Philadelphia | 2023-02-18 10:00:00
(5 rows)#我们再来一个
#原始表格
testdb=# select * from students;id |  name  | age | gender | class_id 
----+--------+-----+--------+----------1 | 张三   |  18 | 男     |        12 | 李四   |  19 | 女     |        13 | 王五   |  20 | 男     |        24 | 赵六   |  18 | 女     |        25 | 陈七   |  19 | 男     |        36 | 孙八   |  20 | 女     |        37 | 周九   |  18 | 男     |        48 | 吴十   |  19 | 女     |        49 | 郑十一 |  20 | 男     |        510 | 王十二 |  18 | 女     |        511 | 何一   |  23 | 女     |        512 | 和二   |  32 | 男     |        5
(12 rows)#作为列选项
testdb=# select name, (select count(*) from students where students.age > 20) as male_count from students;name  | male_count 
--------+------------张三   |          2李四   |          2王五   |          2赵六   |          2陈七   |          2孙八   |          2周九   |          2吴十   |          2郑十一 |          2王十二 |          2何一   |          2和二   |          2
(12 rows)

当然,除了select,也可以用于delete和Update,总之,子查询,实际上就是一种嵌套查询方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/9009.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flink任务优化分享

Flink任务优化分享 1.背景介绍 线上计算任务在某版本上线之后发现每日的任务时长都需要三个多小时才能完成,计算时间超过了预估时间,通过Dolphinscheduler的每日调度任务看,在数据层 dwd 的数据分段任务存在严重的性能问题,每天…

【python】flask查询更新指定的某一条记录

PackageRecord.query.filter_by(idpackage_id).update(json_data) 这段代码的问题在于它不能正确地更新指定的记录。这是因为 update() 方法是 SQLAlchemy 提供的一种批量更新的方法,他通过接收一个字典对象来更新记录。但是在你的代码中,json_data 应该…

20230721在WIN10下安装openssl并解密AES-128加密的ts视频切片

20230721在WIN10下安装openssl并解密AES-128加密的ts视频切片 2023/7/21 22:58 1、前言: AES-128加密的ts视频切片【第一个】,打开有时间限制的! https://app1ce7glfm1187.h5.xiaoeknow.com/v2/course/alive/l_64af6130e4b03e4b54da1681?typ…

研发机器配网方案(针对禁止外网电脑的组网方案)

背景:公司是研发型小公司,难免会使用A某D和K某l 等国内免费软件,这两个是业界律师函发得最多的软件。最简单的方案是离网使用,但是离网使用比较麻烦的是要进行文件传输,需要使用U盘拷贝,另外研发型企业一般…

ChatGPT:人机交互新境界,AI智能引领未来

一、ChatGPT:智能交流的新标杆 ChatGPT是基于GPT技术的最新版本,拥有深度学习模型的基因。它通过在大量数据上进行预训练,可以理解和生成自然语言,从而实现了与人类更加自然流畅的对话和交流。 二、ChatGPT的技术背景和工作原理 …

【动态规划上分复盘】这是你熟悉的地下城游戏吗?

欢迎 前言一、动态规划五步曲二、地下城游戏题目分析思路:动态规划具体代码如下 总结 前言 本文讲解关于动态规划思路的两道题目。 一、动态规划五步曲 1.确定状态表示(确定dp数组的含义)2.确定状态转移方程(确定dp的递推公式&a…

Docker:Docker-Compose

Docker:Docker-Compose 一、Docker-Compose 介绍1.1 Docker-Compose 概述二、Docker-Compose 安装2.1 Docker Compose 环境安装2.2 下载2.3 安装三、Docker-Compose 使用3.1 YAML 文件格式及编写注意事项3.2 使用 YAML 时需要注意下面事项3.3 Docker-Compose配置常用字段3.4 D…

Python中pyecharts模块

pyecharts模块 官网:pyecharts官网 pyecharts框架画廊 如果想要做出数据可视化效果图, 可以借助pyecharts模块来完成概况 : Echarts 是个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可. 而…

java面试整理

一、 JVM部分 JVM内存溢出(一)之排查初体验_少负 | 气节的博客-CSDN博客 JVM内存溢出(二)之双亲委派机制_少负 | 气节的博客-CSDN博客 JVM内存溢出(三)之JVM8内存模型_少负 | 气节的博客-CSDN博客 JVM内存溢出(四)之垃圾回收器_少负 | 气节的博客-CSDN博客 JVM内存溢出(五…

解决 excel 文件头问题 sap 不识别

一个任务需要上传 excel 到 sap 使用 openpyxl 生成的不识别 excel 保存后可以识别 经过分析,可能是文件头的问题,因为看起来没有区别。 excel 的文件头为 [Content_Types].xml openpyxl 生成的文件头为 docProps/app.xml 修改为文件头有点过于繁琐…

巅峰极客2023 hellosql

随便输一个payload,有waf 这题只有两个回显,分别是太酷啦和nonono,不显示报错、登录成功等各种信息,目前只能想到用时间盲注。 抓包fuzz,194都是被过滤的 不止这些,手工测出来if、sleep、benchmark、*、rp…

办公室安全升级,如何保障人身财产安全?

视频监控,一种常见的安全措施,以监视和记录办公室内的活动。这项技术为企业提供了许多优势,包括保障员工和财产安全、帮助调查犯罪事件、提高业务管理效率以及应对突发事件。 因此,在合理范围内应用视频监控,将为企业提…

【算法题】2763. 所有子数组中不平衡数字之和

题目&#xff1a; 一个长度为 n 下标从 0 开始的整数数组 arr 的 不平衡数字 定义为&#xff0c;在 sarr sorted(arr) 数组中&#xff0c;满足以下条件的下标数目&#xff1a; 0 < i < n - 1 &#xff0c;和 sarr[i1] - sarr[i] > 1 这里&#xff0c;sorted(arr) 表…

【Python提取Excel表格中符合条件的数据】

使用Python提取Excel表格中符合条件的数据 在数据处理和分析的过程中&#xff0c;我们经常需要从Excel表格中提取特定条件下的数据。Python的pandas库为我们提供了方便的方法来进行数据查询和过滤。 表格内容如下&#xff1a; 序号xy11.52.823.24.732.13.644.31.954.13.2 我…

go压力测试

压力测试 1.1.1. Go怎么写测试用例 开发程序其中很重要的一点是测试&#xff0c;我们如何保证代码的质量&#xff0c;如何保证每个函数是可运行&#xff0c;运行结果是正确的&#xff0c;又如何保证写出来的代码性能是好的&#xff0c;我们知道单元测试的重点在于发现程序设计…

Oralce数据库 手工重新创建控制文件

控制文件对于Oralce数据库的作用&#xff0c;就好像微软操作系统中注册表的作用一样。控制文件是一个比较小的二进制文件&#xff0c;记录着数据库的结构信息。如果数据库控制文件发生孙华的话&#xff0c;则Oracle将无法正常启动。通常情况下&#xff0c;在创建数据库时会自动…

SAP从放弃到入门系列之批次派生-Batch Derivation-Part1

文章目录 一、概述二、系统配置三、主数据3.1 分类主数据3.2 派生规则设置3.2.1发送物料3.2.2 接收物料 四、 测试数据&#xff08;生产订单&#xff09;五、 最后 Batch Derivation翻译成批次派生&#xff08;衍生&#xff09;或批次继承都是问题不大&#xff0c;继承和派生个…

LeetCode104. 二叉树的最大深度

104. 二叉树的最大深度 文章目录 [104. 二叉树的最大深度](https://leetcode.cn/problems/maximum-depth-of-binary-tree/)一、题目二、题解方法一&#xff1a;递归方法二&#xff1a;迭代 一、题目 给定一个二叉树&#xff0c;找出其最大深度。 二叉树的深度为根节点到最远叶…

机器学习深度学习——线性回归的基本元素

回归用来表示输入输出之间的关系。 用实际例子来解释一下线性回归&#xff1a;根据房屋的面积、房龄来估算房屋价格。为了实现这个预测放假的模型&#xff0c;需要收集一个真实的数据集&#xff0c;该数据集包括了房屋的销售价格、面积和房龄。 在机器学习中&#xff0c;这个数…

lambda匿名函数

问题:什么是lambda函数?它有什么好处?举例说明 解答 含义 在Python中,不通过def来声明函数名字,而是通过lambda关键字来定义的函数称为匿名函数,即函数没有具体的名称,你可以理解为一句话写一个函数 Lambda表达式是Python中一类特殊的定义函数的形式,从语义上讲,它…