有过数据库开发经验的,可能都知道,对于update/delete/insert等更改数据库内容的语句,在操作进行时,一般都会自动加锁,以保证数据的正确性。
但是有一个比较特殊却常用的语句,select语句,即使在执行update/delete/insert等语句导致表被加了锁之后,也不能阻止 select语句 的执行。那么,要如何给表加锁才能使得在加锁期间,select语句也不能执行呢?可能不同的数据库有不同的实现方式,本文以 postgresql 数据库为例进行说明。
① postgresql 官网上对锁的描述:http://www.postgresql.org/docs/8.2/static/explicit-locking.html
在页面中搜索“ACCESS EXCLUSIVE”这个关键字,对它的描述为:
Conflicts with locks of all modes (ACCESS SHARE, ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, and ACCESS EXCLUSIVE). This mode guarantees that the holder is the only transaction accessing the table in any way. Acquired by the ALTER TABLE, DROP TABLE, TRUNCATE, REINDEX, CLUSTER, and VACUUM FULL commands. This is also the default lock mode for LOCK TABLE statements that do not specify a mode explicitly.
Tip: Only an ACCESS EXCLUSIVE lock blocks a SELECT (without FOR UPDATE/SHARE) statement.
② 从描述来看,只有“ACCESS EXCLUSIVE”这种锁才可以阻止 select语句的执行,那么该如何获取这种锁呢?下面说明。
③ 这个时候,就轮到 "LOCK" 这个命令出场了,官网说明: http://www.postgresql.org/docs/8.2/static/sql-lock.html
其中,“Examples”部分有使用例子。下面我也给出我地本测试用的示例截图:
前提:假设数据库中有“pwd_ctz_mng”这么一张表
④选中下图中的蓝色语句(必须要选中),点击上面 绿色的向右 的箭头来执行:
⑤ 这个时候,pwd_ctz_mng 已经被上锁了,然后,另个再开一个 query 对话框,即使用如下 select 语句:
⑥ 从上图可以看出,select语句执行超时了(图的右下角显示了超时时间),并给出了异常。关于超时时间的设置,在postgresql数据库配置文件中有配置的(下面是windows的截图,linux的可能不一样),如下,我设置的是 30 秒:
⑦ 如果按下图,选中蓝色的SQL语句(必须要这么选),点击上面 绿色的向右的 箭头来执行:
⑧则在⑦执行完之后,select语句会立即搜索出结果,不会出现超时现象:
PS:上面只是演示了 select语句被阻止了,但实际上,只要使用了 ACCESS EXCLUSIVE 这个级别的锁,所有语句应该都被阻止了,直至该锁被释放。
相关推荐
**PostgreSQL编程教程** 在IT领域,数据库管理是不可或缺的一部分,而PostgreSQL作为一款开源、对象...无论是初学者还是有经验的开发者,都能从中受益,提升你在数据库领域的专业技能。开始你的PostgreSQL编程之旅吧!
PostgreSQL是一种开源关系型数据库管理系统(RDBMS),在全球范围内被广泛应用,因其强大的功能、高度的稳定性和良好的社区支持而受到赞誉。标题中提到的"postgresql-42.2.2.jar"和"postgresql-9.2-1003.jdbc4.jar...
PostgreSQL,通常被称为Postgres,是一款强大的开源关系型数据库管理系统(RDBMS),以其高度的稳定性和丰富的功能而受到全球开发者的广泛欢迎。它支持多种编程语言,包括Python、Java、C、C++、Perl、PHP等,为各种...
此外,它还介绍了页级和表级别的锁定策略以及行级锁定,以平衡并发性能和冲突。 2. **查询优化器**:PostgreSQL的查询优化器是其强大功能的关键,它能够根据统计信息和成本模型选择最佳的执行计划。书中详细解释了...
通过深入学习“PostgreSQL 9 从零开始学”这本书,你可以逐步熟悉PostgreSQL的使用,无论是进行日常的数据存储,还是开发复杂的数据库应用,都将变得更加得心应手。记得实践是检验真理的唯一标准,理论学习的同时,...
综上所述,PostgreSQL 8.2.3中文文档不仅涵盖了SQL的基础,还包括了数据库管理、高级特性和最佳实践,对于开发者、DBA和系统管理员来说都是不可或缺的学习资料。通过深入阅读和实践,可以充分利用PostgreSQL的强大...
**PostgreSQL 9.5.2-1** 是一个重要的关系型数据库管理系统版本,它在PostgreSQL系列中占据着显著的地位。此版本是专为Windows操作系统设计的,提供了丰富的功能和增强的性能,使得数据库管理和开发更为高效。 ...
- **热更新**:在不锁定整个表的情况下更新行,提高并发处理能力。 - **索引增强**:增加了GiST、GIN等新型索引结构,支持更多复杂查询场景。 - **并行处理**:优化了查询执行计划,增强了多核CPU环境下的并行处理...
3. **多版本并发控制(MVCC)**:通过MVCC实现读写并发,允许读取不会被写锁定的数据,提高了并发性能。 4. **复杂的数据类型**:除了基本的整数、浮点数、字符串和日期/时间类型,还支持数组、JSON、XML、UUID等...
- **分布式事务**:目前PostgreSQL不支持分布式事务,所有的事务命令都由单个后端执行。 - **嵌套事务**:PostgreSQL当前版本并不支持嵌套事务。 #### 九、总结 PostgreSQL通过其强大的事务处理能力,确保了数据的...
在默认情况下,创建索引会导致表被锁定,禁止DML(插入、更新、删除)操作,直至索引构建完成,但允许读取操作继续进行。然而,在高并发的生产环境中,这种锁定可能导致用户无法正常操作,因此引入了`CONCURRENTLY`...
5. **查询优化**:内置的查询优化器能够分析SQL语句,选择最佳的执行计划,包括索引扫描、全表扫描、哈希连接等策略。 6. **安全性**:PostgreSQL提供了用户权限管理,可以为不同的用户分配不同级别的访问权限,...
9. **测试与验证**:迁移后,必须进行详尽的单元测试和集成测试,确保所有功能在PostgreSQL环境中都能正常工作,包括任务的创建、调度、执行和监控等。 通过以上步骤,我们可以成功地将XXL-JOB与PostgreSQL数据库...
1. **REINDEX CONCURRENTLY**: 传统的REINDEX操作会锁定整个表,阻止其他会话的读写操作。现在,PostgreSQL引入了并发重索引功能,通过开启事务、新建临时索引和逐步替换原有索引的方式,使得重索引可以在不阻塞其他...
这个"postgresql官方手册的中文版"涵盖了以上所有内容,通过详细阅读和实践,无论是初学者还是经验丰富的开发者,都能深入理解和掌握PostgreSQL的核心功能和高级特性,从而更好地利用这一强大的数据库系统。
### PostgreSQL数据库内核分析知识点概览 #### 一、PostgreSQL简介 - **定义**: PostgreSQL是一种功能强大的开源对象关系型数据库系统,支持多种编程语言(如C、Java、Python等)进行应用程序开发,并且提供了丰富...
编写SQL语句执行增删改查,同时可以使用事务处理来确保数据的一致性。 总的来说,PostgreSQL是一个功能强大且灵活的数据库系统,适合各种规模的应用场景。其开源性质、丰富的数据类型和强大的事务处理能力,使其在...
如果不指定 WHERE 子句,那么表中的所有记录都将被删除。 ### 2. 使用 WHERE 子句 WHERE 子句允许我们设置条件来删除特定的记录。例如,我们可以指定多个条件,使用 `AND` 或 `OR` 运算符来组合它们。这使得我们...
- `DDL`:所有不属于ROLE类别的DDL语句。 - `MISC`:其他杂项命令,如DISCARD、FETCH、CHECKPOINT、VACUUM、SET等。 - `ALL`:包含以上所有类别。 示例配置: - 记录所有的DML和DDL语句,并记录所有关系对象: ...