Linux 上 Informix 并发控制要点
一 核心机制总览
- 锁类型与粒度:支持 共享锁(S)、更新/可提升锁(U/Promotable)、排他锁(X);粒度覆盖 数据库、表、页/记录、键级。更新游标先对记录加 U,在真正修改时提升为 X,以减少阻塞。DDL(如 ALTER TABLE/CREATE INDEX)常触发 表级排他锁。
- 隔离级别:提供 Dirty Read、Committed Read、Cursor Stability、Repeatable Read、Last Committed Read 等,用于平衡一致性与并发度。
- 事务与一致性:遵循 ACID,通过锁与日志保障一致性;应用需合理划分事务边界,避免长事务。
- 并发执行与连接:引擎采用 多线程/工作线程 处理并发请求,配合连接池可提升吞吐与资源复用。
二 隔离级别与锁行为对照
| 隔离级别 |
读一致性 |
典型锁/行为 |
并发与风险 |
| Dirty Read |
可能读到未提交数据 |
不加或极少共享锁 |
并发最高,存在脏读/不可重复读 |
| Committed Read(CR) |
只读到已提交数据 |
读操作多为共享锁,读完尽快释放 |
高并发、读多写少场景常用 |
| Cursor Stability(CS) |
游标打开后行级稳定性 |
读取行加共享锁,游标定位后释放或升级 |
兼顾一致性与并发 |
| Repeatable Read(RR) |
事务内可重复读 |
更强的共享/范围锁,可能锁范围更大 |
一致性高,锁冲突与阻塞风险上升 |
| Last Committed Read(LCR) |
读到最近一次已提交版本 |
通过版本/回滚段读取,减少锁等待 |
高并发下读多写少友好,避免脏读 |
说明:具体锁与行为受表锁模式、语句类型、索引与隔离级共同影响,需结合业务选择。
三 锁等待 死锁与监控处理
- 锁等待模式:会话级可设置
SET LOCK MODE TO NOT WAIT(不等待,冲突立即报错)
SET LOCK MODE TO WAIT(无限等待)
SET LOCK MODE TO WAIT <秒数>(推荐,如 5–10 秒)
OLTP 建议设置有限等待,避免雪崩式阻塞。
- 查看会话设置与隔离级:
onstat -g sql(含 Lock Mode 与 Isolation Level)。
- 死锁检测与处理:引擎周期性检测,抛出 -143 deadlock detected;可用
onstat -p 的 deadlks 观察累计检测数,或用 onmode -I 143 开启跟踪日志定位问题。
- 锁资源与上限:参数 LOCKS 控制实例级锁表大小;现代版本支持动态扩展锁资源(早期版本约 800 万 + 15×10 万,后续版本上限可至 5 亿 级),但过大浪费内存、过小易 锁表溢出。
- 常用诊断:
onstat -k 查看锁表与锁类型(如 HDR+S/HDR+X 表示库级共享/排他锁),配合 onstat -g sql 定位会话。
四 提升并发的实用配置与 SQL 实践
- 数据库参数:适度增大 缓冲池(如 dbbufsize)、优化 逻辑/物理日志 大小与数量、按 CPU 核数与负载 调整并发线程数(如 max_threads),减少磁盘 I/O 与线程争用。
- 锁与隔离策略:在 读多写少 场景优先 CR/LCR;对热点行更新使用 游标 + FOR UPDATE 触发 U→X 的受控升级,避免大范围表锁。
- SQL 与索引:为高频查询建立合适索引、避免全表扫描、用 EXPLAIN 检查执行计划;必要时用 分区表 降低锁竞争范围。
- 连接与会话治理:使用 连接池、控制事务长度、避免交互式长事务;必要时在应用侧实现 重试/退避。
- 系统层面:提升 文件描述符 限制、优化 TCP 参数、选用 XFS/EXT4 等高效文件系统,减少 I/O 瓶颈。
五 典型场景与建议
- 报表/明细查询为主:选用 CR/LCR,缩短事务,避免锁持有时间过长。
- 高并发订单扣减:以 行级锁 + U→X 为主,事务尽量短;热点数据考虑拆分/分区与合理索引。
- 批量导入/结构变更:安排在低峰,使用 表级排他锁 或维护窗口,避免与在线业务强冲突。
- 长事务与锁升级:拆分事务、减少扫描范围、必要时调整隔离级与访问路径,降低锁等待与死锁概率。