Java语言、程序员、后端开发、多线程高并发
吐槽
程序员汪进新公司
开发业务代码,类似某内容的上下线功能
忘记考虑高并发场景
导致生产出现了脏数据
解决方案最简单粗暴的就是mysql的悲观锁,这里写不谈其他锁,如缓存锁、乐观锁等等。
mysql的锁其实分很多种,我这里就讲了最简单的应用场景
基础准备
- 多线程
- 高并发
- 串行锁
- mysql行锁
先从mysql层面分析案例
先创建一张表
唯一索引
初始化数据
注意bizType就是定义的枚举值类型,bizId就是内容的ID
如内容上下线必须加串行锁来防止并发
注意我把MySQL调整成需要手动提交事务
set session autocommit=0; 就这行命令搞定
窗口1开启一个事务begin
我打开另一个窗口2,执行相同的SQL
会发现一直执行中
当窗口1提交COMMIT后,窗口2才能继续执行完成。
总结
- 利用mysql的for update悲观锁来防并发,简单有效
- for update 切记后面要是索引的查询条件,如上唯一索引
- 业务代码中切记在事务代码中去操作
- 特别是审批业务,都必须考虑并发情况
- 这里先不谈其他锁
java代码
串行锁防并发
事务开启
select XXX where 唯一索引 for udpate
初次调用需要 insert 这个common_trace表
//TODO 其他业务DB操作
事务提交