上一篇
场景引入:
凌晨3点,电商大促的支付系统突然报警——"订单重复扣款"!技术团队紧急排查,发现两个支付请求同时修改了同一用户的余额。💸 这时,Oracle的锁机制就像交通警察一样出场了,它举起红绿灯🚦,让这些"数据车辆"有序通行,避免撞车(数据混乱),今天我们就来拆解这套精妙的并发控制体系!
当多个用户/事务同时操作数据库时,会出现三类典型问题:
Oracle通过锁+多版本并发控制(MVCC) 的组合拳解决这些问题。
锁类型 | 作用范围 | 类比 |
---|---|---|
行级锁 | 锁定单行数据 | 给文件柜里某份文件贴封条 📄 |
表级锁 | 锁定整张表 | 给整个文件柜上锁 🗄️ |
数据库锁 | 锁定整个数据库 | 锁上档案室大门 🏛️ |
开发中最常用的是行级锁,兼顾并发性能与安全性
🔵 共享锁(S锁):
SELECT ... FOR UPDATE
🔴 排他锁(X锁):
INSERT/UPDATE/DELETE
🟡 行级共享锁(SS锁):
当单个事务锁定超过2000行时,Oracle可能自动将行锁升级为表锁(可通过_ENABLE_ROW_LOCKING
参数调整)
Oracle每3秒检测一次死锁,发现后会选择牺牲其中一个事务(记录在alert.log
中):
-- 模拟死锁场景(事务A) UPDATE accounts SET balance=100 WHERE user_id=1; -- 持有id=1的X锁 -- 此时事务B持有id=2的X锁并请求id=1的锁 UPDATE accounts SET balance=200 WHERE user_id=2; -- 等待id=2的锁
通过参数设置最大等待时间(默认无限等待):
ALTER SYSTEM SET distributed_lock_timeout=30; -- 单位:秒
-- 查看当前锁竞争(2025年Oracle 23c语法) SELECT l.session_id, o.object_name, l.locked_mode, s.osuser FROM v$locked_object l JOIN dba_objects o ON l.object_id = o.object_id JOIN v$session s ON l.session_id = s.sid;
-- 找出被阻塞的会话 SELECT blocker.sid AS blocker_sid, waiter.sid AS waiter_sid, blocker.sql_text AS blocker_sql FROM v$session blocker, v$session waiter WHERE waiter.blocking_session = blocker.sid;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 默认推荐
SELECT * FROM orders FOR UPDATE NOWAIT; -- 不等待直接报错
根据2025年最新技术文档,Oracle 23c增强了:
本文由 回斌蔚 于2025-07-28发表在【云服务器提供商】,文中图片由(回斌蔚)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/463497.html
发表评论