上一篇
场景引入:
凌晨三点,运维小张被报警短信惊醒——某电商平台的商品库存接口又崩了,排查发现,高并发下频繁的"先查再删"操作导致数据库连接池耗尽,这已经是本月第三次了,他揉着太阳穴想:"要是能把这类操作打包成一个原子操作该多好..."
DELIMITER // CREATE PROCEDURE smart_data_operation( IN p_operation_type VARCHAR(10), -- 'INSERT'/'DELETE' IN p_id INT, -- 主键ID IN p_data JSON, -- 插入的JSON数据 OUT p_result INT -- 执行结果(1成功,0失败) ) BEGIN DECLARE v_exists INT DEFAULT 0; -- 显式开启事务 START TRANSACTION; -- 检查记录是否存在 SELECT COUNT(1) INTO v_exists FROM products WHERE id = p_id; IF p_operation_type = 'INSERT' THEN IF v_exists = 0 THEN INSERT INTO products(id, name, stock) VALUES(p_id, JSON_EXTRACT(p_data, '$.name'), JSON_EXTRACT(p_data, '$.stock')); SET p_result = 1; ELSE SET p_result = 0; -- 已存在则失败 END IF; ELSEIF p_operation_type = 'DELETE' THEN IF v_exists > 0 THEN DELETE FROM products WHERE id = p_id; SET p_result = 1; ELSE SET p_result = 0; -- 不存在则失败 END IF; END IF; -- 统一提交 COMMIT; -- 异常处理 DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SET p_result = 0; END; END // DELIMITER ;
关键优化点:
索引热更新
-- 在存储过程末尾添加(适用于高频删改场景) IF p_result = 1 AND p_operation_type = 'DELETE' THEN ANALYZE TABLE products; -- 更新统计信息 END IF;
批量操作支持
-- 接收JSON数组处理(MySQL 8.0+) CREATE PROCEDURE batch_operations(IN op_list JSON) BEGIN DECLARE i INT DEFAULT 0; WHILE i < JSON_LENGTH(op_list) DO -- 解析每个操作项并执行... SET i = i + 1; END WHILE; END
内存控制
-- 大数据量操作时分页处理 DECLARE page_size INT DEFAULT 1000; DECLARE max_id INT; SELECT MAX(id) INTO max_id FROM target_table;
WHILE min_id <= max_id DO DELETE FROM target_table WHERE id BETWEEN min_id AND min_id + page_size; SET min_id = min_id + page_size + 1; COMMIT; -- 分段提交释放内存 END WHILE;
## 四、避坑指南
1. **参数验证**
```sql
-- 防止SQL注入
IF p_operation_type NOT IN ('INSERT','DELETE') THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '非法操作类型';
END IF;
SELECT ... FOR UPDATE SKIP LOCKED
LIMIT 1000
分批处理 -- 关闭binlog记录(临时性大批量操作) SET SESSION sql_log_bin = 0; -- 操作完成后记得恢复
最新实践建议(2025年8月):
:
就像给数据库操作装上"瑞士军刀",一个好的存储过程不仅能减少网络交互,更能通过数据库原生能力实现原子操作,下次当你面对需要先查后改的业务时,不妨试试这种"打包处理"的思路,或许凌晨的报警短信就能少收几条。
本文由 阙乐儿 于2025-08-02发表在【云服务器提供商】,文中图片由(阙乐儿)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/519931.html
发表评论