涉及到的概念
互联网技术四大法宝
多线程 分布式 异步 缓存
接口的幂等性
并发
并行
编程式事务
悲观锁
乐观锁
基于状态基的乐观锁
业务场景一:
业务场景二:
case1
涉及系统:
物流系统、订单系统
涉及功能:
订单查询、订单发货
一、@Transaction 的源码理解
会占用数据库连接资源
1、 代码设置数据库最大连接数为2
2、物流系统内的发货逻辑线程等待10S模拟执行业务逻辑
3、订单查询:根据单号查询订单
订单发货:根据单号查询订单,然后调物流系统的发货接口
4、浏览器打开三个窗口,一次访问,发货订单1,发货订单2,查询订单3
结果:
订单1、 2正常发货,订单3查询报 数据库超过最大连接数
原因:
@Transaction会占用数据库连接资源,订单1和2的代码开启事务,占用了两个资源,10秒内没有释放,所以查询订单3会报超过最大连接数错误。
解决方法:
使用编程式事务Transactiontemplate(事务模板)来针对修改数据库的部分添加事务
case2(case1升级)
用户连续多次点击提交会导致接口幂等性问题
开启6个线程来模拟多次点击提交的场景
应对方法:
悲观锁:select * from table for update
乐观锁:select * from table where order id = …
乐观锁加version字段
update order set status = 0 where order id = 1 and version = 0
为保证两个系统的数据的一致性使用基于状态基的乐观锁
在事务模板返回true后再去调用物流系统发货