高并发数据库事务优化的核心原则是减少锁竞争、缩短事务时长、合理选择隔离级别,并结合分布式架构实现水平扩展。实战中,通过读写分离、乐观锁、事务拆分和连接池优化,能将TPS提升数倍。
设计原则
1. 最小化事务范围:事务只包含必要的操作,避免不必要的读写。2. 选择合适的隔离级别:高并发场景优先使用READ COMMITTED或快照隔离。3. 索引优化:确保WHERE条件命中索引,减少全表扫描。4. 连接复用:使用连接池管理数据库连接。
策略一:乐观锁与悲观锁
乐观锁适用于读多写少场景,使用版本号或时间戳判断数据是否被修改,避免长时间锁表。悲观锁适合写多场景,但需尽量缩短锁持有时间。例如,在MySQL中使用SELECT ... FOR UPDATE。
实战技巧:事务拆分
将长事务拆分为多个短事务,中间通过业务逻辑保证一致性。例如,库存扣减和订单创建分开处理,使用消息队列异步化非核心操作。代码示例:BEGIN; UPDATE stock SET num=num-1 WHERE id=1 AND num>0; IF ROW_COUNT()=0 THEN ROLLBACK; ELSE COMMIT; END;
读写分离与分库分表
主库写,从库读,利用MySQL主从复制实现。分库分表基于业务键(如user_id)路由,ShardingSphere或MyCat工具简化实现。高并发下,单库QPS上限约5000,需提前规划分片。
连接池与批量操作
HikariCP是高性能连接池,配置maximumPoolSize=核心线程数*2。使用批量INSERT/UPDATE减少网络RTT,例如INSERT INTO table VALUES (...),(...); 可将插入速度提升10倍。
分布式事务优化
避免2PC,使用TCC或SAGA模式。Seata框架简化实现,业务拆分为Try-Confirm-Cancel阶段,异步补偿失败环节。
监控与调优
使用slow log、EXPLAIN分析查询计划,监控innodb_row_lock_time_avg。参数调优:innodb_buffer_pool_size=内存70%,innodb_log_file_size=1G。
FAQ
Q: 高并发下事务死锁怎么处理?
A: 统一加锁顺序,设置锁超时innodb_lock_wait_timeout=10s,业务重试。
Q: 乐观锁并发冲突率高怎么办?
A: 增加重试次数,结合随机延迟,极端情况降级为队列处理。
Q: 分库分表后事务跨库怎么做?
A: 转为最终一致性,使用MQ或分布式ID生成器。
Q: MySQL TPS瓶颈在哪里?
A: 主要在锁竞争和磁盘IO,优化索引和SSD存储。