下面的列表显示了可用的锁模式和它们被 PostgreSQL 自动使用的环境。 你也可以用命令 LOCK 明确获取这些锁。请注意所有这些锁模式都是表级锁,即使它们的名字包含单词 "row";这些锁模式的名称是历史造成的。从某种角度而言,这些名字反应了每种锁模式的典型用法 — 但是语意都是一样的。 两种锁模式之间真正的区别是它们有着不同的冲突锁集合。两个事务在同一时刻不能在同一个表上持有相互冲突的锁。 (不过,一个事务决不会和自身冲突。比如,它可以在一个表上请求 ACCESS EXCLUSIVE 然后稍后的时候请求 ACCESS SHARE。) 非冲突锁模式可以由许多事务并发地持有。 请特别注意有些锁模式是自冲突的(比如,在任意时刻 ACCESS EXCLUSIVE 模式就不能够被多个事务拥有) 而其它地都不是自冲突的(比如,ACCESS SHARE 可以被多个事务持有)。 一旦请求到了某种锁,那么该锁模式将持续到事务结束。
表级锁模式
ACCESS SHARE
只与 ACCESS EXCLUSIVE 冲突。
SELECT 和 ANALYZE 命令在被引用的表上请求一个这种锁。通常,任何只读取表而不修改它的命令都请求这种锁模式。
ROW SHARE
与EXCLUSIVE和ACCESS EXCLUSIVE模式冲突。
SELECT FOR UPDATE 命令在目标表上需要一个这样模式的锁(加上在所有被引用但没有 FOR UPDATE 的表上的 ACCESS SHARE 锁)。
ROW EXCLUSIVE
与 SHARE,SHARE ROW EXCLUSIVE, EXCLUSIVE 和 ACCESS EXCLUSIVE 模式冲突。
命令 UPDATE,DELETE, 和 INSERT 自动请求这个锁模式。 (加上所有其它被引用的表上的 ACCESS SHARE 锁)。 通常,这种锁将被任何修改表中数据的查询请求。
SHARE UPDATE EXCLUSIVE
和 SHARE UPDATE EXCLUSIVE,SHARE, SHARE ROW EXCLUSIVE,EXCLUSIVE, 和 ACCESS EXCLUSIVE 模式冲突。 这个模式保护一个表不被并发模式改变和 VACUUM。
VACUUM(不带 FULL 选项)请求这样的锁。
SHARE
与 ROW EXCLUSIVE,SHARE UPDATE EXCLUSIVE, SHARE ROW EXCLUSIVE,EXCLUSIVE 和 ACCESS EXCLUSIVE 模式冲突。 这个模式避免表的并发数据修改。
CREATE INDEX 语句要求这样的锁模式。
SHARE ROW EXCLUSIVE
与 ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE,SHARE, SHARE ROW EXCLUSIVE,EXCLUSIVE,和 ACCESS EXCLUSIVE 模式冲突。
任何 PostgreSQL 命令都不会自动请求这样的锁模式。
EXCLUSIVE LOCK
与 ROW SHARE,ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE,SHARE ROW EXCLUSIVE, EXCLUSIVE 和 ACCESS EXCLUSIVE 模式冲突。 这个模式只允许并发 ACCESS SHARE 锁,也就是说, 只有对表的读动作可以和持有这个锁模式的事务并行执行。
任何 PostgreSQL 命令都不会自动请求这样的锁模式.
ACCESS EXCLUSIVE
与所有模式冲突。 ( ACCESS SHARE, ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, 和 ACCESS EXCLUSIVE). 这个模式保证其所有者(事务)是可以用任意方式访问该表的唯一事务。
ALTER TABLE, DROP TABLE,REINDEX,CLUSTER和 VACUUM FULL 命令要求这样的锁。 在 LOCK TABLE 命令没有明确声明需要的锁模式时,它也是缺省锁模式。
提示: 只有 ACCESS EXCLUSIVE 阻塞 SELECT (没有 FOR UPDATE语句)。
除了表级锁以外,还有行级锁。 特定行上的行级锁是在行被更新的时候自动请求的(或者被删除时或标记为更新)。 锁一直保持到事务提交或者回滚。 行级锁不影响对数据的查询;它们只阻塞对同一行的写入。 要在不修改某行的前提下请求在该行的行级锁,用 SELECT FOR UPDATE 选取该行。请注意一旦我们请求了特定的行级锁, 那么该事务就可以多次对该行进行更新而不用担心冲突。
PostgreSQL 不会在内存里保存任何关于已修改行的信息, 因此对一次锁定的行数没有限制。 不过,锁住一行会导致一次磁盘写;因此,象 SELECT FOR UPDATE 将修改选中的行以标记它们, 因此会导致磁盘写。
除了表级别的和行级别的锁以外, 页面级别的共享/排他销也用于控制对共享缓冲池中表页面的读/写访问。 这些锁在抓取或者更新一行后马上被释放。 应用程序员通常不需要关心页级锁,我们在这里提到它们只是为了完整。
明确锁定的使用可能会增加死锁的可能性, 死锁是是指两个(或多个)事务相互持有对方期待的锁。比如,如果事务 1 在表 A上持有一个排他锁, 同时试图请求一个在表 B 上的排他锁, 而事务 2 已经持有表B的排他锁,而却正在请求在表 A上的一个排他锁,那么两个事务就都不能执行。 PostgreSQL 自动侦测到死锁条件并且会通过退出一个当事的事务来解决这个问题, 以此来允许其它事务完成。(具体哪个事务会被退出是很难预计的,而且也不应该依靠这样的预计。)
要注意的是死锁也可能会因为行级锁而发生(因此,即使是没有使用明确的锁定,也可能发生)。 考虑这样一种情况,两个并发事务在修改一个表。第一个事务执行了:
UPDATE accounts SET balance = balance + 100.00 WHERE acctnum = 11111;
这样就在指定帐号的行上请求了一个行级锁。然后,第二个事务执行:
UPDATE accounts SET balance = balance + 100.00 WHERE acctnum = 22222;
UPDATE accounts SET balance = balance - 100.00 WHERE acctnum = 11111;
第一个 UPDATE 语句成功地在指定行上请求到了一个行级锁,因此它成功更新了该行。但是第二个 UPDATE 语句发现它试图更新地行已经被锁住了,因此它等待持有该锁的事务结束。事务二现在就在等待事务一结束,然后再继续执行。 现在,事务一执行:
UPDATE accounts SET balance = balance - 100.00 WHERE acctnum = 22222;
事务一企图在指定行上请求一个行级锁,但是它得不到:事务二已经持有这样的锁了。 所以它等待事务二完成。因此,事务一在事务二上阻塞住了,而事务二在事务一上阻塞住了:这就是一个死锁条件。 PostgreSQL 将侦测这样的条件并退出其中一个事务。
防止死锁的最好方法通常是保证所有使用一个数据库的应用都以一致的顺序在多个对象上请求锁定。 在上面的例子里,如果两个事务以同样的顺序更新那些行,那么就不会发生死锁。我们也要保证在一个对象上请求的第一个锁是该对象需要的最高的锁模式。 如果我们无法提前核实这些问题,那么我们可以通过在现场重新尝试因死锁而退出的事务的方法来处理。
只要没有检测到死锁条件,一个等待表级锁或者行级锁的事务将等待冲突锁的释放不确定的时间。 这就意味着一个应用持有打开的事务时间太长可不是什么好事情(比如锁,等待用户输入)。
相关推荐
回归测试是一套复杂完整的测试,用来测试嵌入在PostgreSQL里的的SQL实现。它同时测试标准SQL操作和PostgreSQL的扩展SQL。...并行测试使我们对进程内部通讯和锁的正确工作有足够的信心。由于历史原因,
**PostgreSQL 10.1 知识点详解** PostgreSQL 是一款强大的开源关系型数据库管理系统,以其稳定性、可扩展性和强大的SQL支持...同时,遵循提供的安装编译方法,可以顺利地在本地环境中搭建和测试PostgreSQL 10.1实例。
- 设置内存锁页大小限制(`*softmemlock`和`*hardmemlock`),避免系统资源过度消耗导致的性能下降。 - 关闭SELinux,简化安全策略的配置,提高系统的可管理性。 #### 四、SQL优化基础 - **查询语句优化**: - 了解...
并行执行不支持带有锁谓词的SELECT查询、游标、窗口函数、有序集聚合函数和完全外部联接等。 #### 并行查询的配置参数 在PostgreSQL中,关于并行查询的参数有多个,它们决定了并行执行的方式: - `max_parallel_...
对于大型生产环境,通常需要仔细监控和测试,以确保修改后的参数能带来实际性能提升而不引起问题。同时,定期检查`postgresql.conf`文件的注释和更新,以便了解新版本可能引入的新参数或参数变更。
10. **性能测试与调优**:通过压力测试工具(如JMeter)模拟高并发场景,发现并解决性能问题。 11. **监控日志分析**:分析数据库日志,识别慢查询和异常行为,进行针对性优化。 12. **持续监控与维护**:数据库...
- **乐观锁与悲观锁**:了解两种常见的锁机制及其应用场景,根据业务需求选择合适的锁策略。 ##### 6. 存储优化与空间数据处理 - **表空间管理**:合理规划表空间分布,利用分区技术提高数据访问效率。 - **空间...
- 监控数据库活动,包括锁等待、事务状态等。 - 使用内置工具如`pg_stat_activity`和第三方工具进行更深入的分析。 5. **故障排除**: - 识别和修复性能瓶颈。 - 避免常见的性能陷阱,如死锁和并发问题。 - ...
9. **测试与验证**:迁移后,必须进行详尽的单元测试和集成测试,确保所有功能在PostgreSQL环境中都能正常工作,包括任务的创建、调度、执行和监控等。 通过以上步骤,我们可以成功地将XXL-JOB与PostgreSQL数据库...
因此,升级之前进行全面的测试和准备工作是必要的,以确保升级过程的顺利进行和应用的稳定运行。 总之,PostgreSQL 10.0版本在功能、性能、安全性和可靠性方面都有显著的增强和改进,为数据库管理员和开发人员提供...
6. **监控与日志**:在使用PostgreSQL的环境下,确保对数据库性能进行监控,包括查询效率、锁等待等,同时关注Nacos的日志,以便及时发现和解决问题。 7. **备份与恢复**:由于数据存储在PostgreSQL中,因此需要...
并行执行只支持不带锁谓词的SELECT查询。正确的索引可能是并行顺序表扫描的更好选择。不支持游标或挂起的查询。窗口函数和有序集聚合函数是非并行的。对IO绑定的工作负载没有好处。 七、并行查询工作原理与机制的...
实践证明,新备份方案极大地降低了备份失败率,压力测试显示,随着数据量和并行度的增加,备份时间得到了显著改善。例如,对于4.1TB的数据,设置3000个`wal_keep_segments`时,备份时间从11小时减少到11.5小时,表明...
在"PostgreSQL-Research-master"这个压缩包中,可能包含了对以上各个方面的详细注释、文档和测试用例,这些都是学习和研究PostgreSQL的宝贵资料。通过深入学习,不仅能够提升对数据库原理的理解,还能够提高解决实际...
pgSqlBlocks pgSqlBlocks是一个用Java编程语言编写的独立应用程序,它使您可以轻松地在进程之间导航,并获取有关PostgreSQL中锁和未决请求的信息。 显示有关与数据库的连接状态的信息,以及有关数据库中进程的信息。...
5. 快照隔离(Snapshot Isolation):类似于可重复读,但更高级,允许某些读写并发,如PostgreSQL的Serializable隔离级别。 四、SQL并发测试实践 在进行SQL并发测试时,你需要模拟多用户环境,执行各种并发操作,...
etcdv3未完成未测试详见方法说明配置项mutex.OptFunc以及返回值锁的使用详见 NewMutex(名称字符串,optFuncs ... mutex.OptFunc)(* mutex.Mutex,错误)创建互斥锁,若name已用于创建读写锁则返回error ,本方法
这是Oracle数据库的一个工作示例,并附有博客文章“使用Spring Boot和JPA测试悲观锁处理” 此处有更多示例: 介绍 这个SpringBoot maven项目是我的一部分,您不仅可以找到对此的解释,还可以找到以下方面的理论背景...
经过相对较旧Linux内核版本(4.14、4.15)和最新的PostgreSQL 11、12devel测试。 大多数脚本都已与PostgreSQL统计视图或perf数据进行交叉测试。 功能列表: 锁追踪 在lwlocks , sema , spin实现,以监视...
这款软件能够模拟多种并发场景,对MSSQL Server、Oracle、Mysql、DB2、PostgreSQL以及Redis等主流数据库进行压力测试,从而帮助用户在事务处理、锁机制等方面深入理解数据库系统的性能表现。 一、数据库压力测试的...