无锡市新吴区住房和建设交通局网站,网络营销产品有哪些特点,织梦开发小说网站教程,建设工作室[SQL系列] 从头开始学PostgreSQL 索引 修改 视图_Edward.W的博客-CSDN博客https://blog.csdn.net/u013379032/article/details/131818865
事务 事务是一系列逻辑相关的数据库操作#xff0c;可以作为一个整体进行操作或者回滚。事务通常会包含一个序列的读或者写操作#xf…[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总之子查询实际上就是一种嵌套查询方式。