表互锁该如何解决
存在流程操作表如下
- 库存下单 -> A,B,C,E,H
- 排号 -> B,A,C,D,E,F,G,I
- 退票 -> B,A,C,G
- 过闸 -> A,G,C
- 生成班次 -> .....
- 调整班次 -> ....
可能会存在的锁
同表锁定:
- 下单->A表.a记录+1 , A表.b记录+1
- 退单->A表.b记录+1 , A表.a记录+1
不同表互锁:
- 下单->A表.a记录+1, B表.a记录+1
- 退单->B表.a记录+1, A表.a记录+1
在两个事务第一步做完后,第二步两个事务互相等待对方完成.这时,就会锁住数据.
同表锁定解决
按主键进行排序,并依次执行,可以解决同表锁定的问题.
不同表锁定解决
- 为每个业务定义临时变量,将该业务的数据全部放入临时变量.
- 定义接口,操作临时变量,Dao层实现该接口
interface 接口
{
void create(临时变量)
}
- 在具体操作中,通过Spring注入接口数组的方式来运行调用数据库.
@Autowired
private List<接口> unitCreates;
// 利用接口循环创建单据,防止更新表顺序冲突
for (接口 unitCreate : unitCreates) {
unitCreate.create(临时变量);
}
本文由 创作,采用 知识共享署名4.0 国际许可协议进行许可。本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为: 2022/02/14 03:05