📚 开源资源分享——颜佐光的个人书架
✉️ 联系站长
书架 / mysql / 锁

表互锁该如何解决

2022-02-14 11:03 · 约 648 字 · 浏览 2,665 次 · 更新 2022-02-14 11:05锁

表互锁该如何解决

存在流程操作表如下

  • 库存下单 -> 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

在两个事务第一步做完后,第二步两个事务互相等待对方完成.这时,就会锁住数据.

同表锁定解决

按主键进行排序,并依次执行,可以解决同表锁定的问题.

不同表锁定解决

  1. 为每个业务定义临时变量,将该业务的数据全部放入临时变量.
  2. 定义接口,操作临时变量,Dao层实现该接口
interface 接口
{
   void create(临时变量)
}
  1. 在具体操作中,通过Spring注入接口数组的方式来运行调用数据库.
@Autowired
private List<接口> unitCreates;

// 利用接口循环创建单据,防止更新表顺序冲突
for (接口 unitCreate : unitCreates) {
    unitCreate.create(临时变量);
}
← 返回《mysql》目录书架 →