1. 死锁背景
1.1 在做高并发秒杀中创建订单、减库存步骤时出现异常:MySQLTransactionRollbackException: Deadlock found when trying to get lock,也就是出现了死锁。
1.2 我们在学多线程时,知道死锁发生在两个线程互相去抢占对方的锁情况,如下图。
1.3 那我们这边出现死锁的原因是什么呢?出现死锁的原因有很多,比如相同记录行锁、索引锁以及GAP锁,我这边应该算是索引锁。在秒杀时,将创建订单、扣减商品库存放在了一个事务中,并且订单表中用到了商品表id作为外键,这个作为外键是关键,因为外键是一种索引,操作时会进行相应的加锁操作,导致发生死锁。
2. 死锁复现
2.1 使用MySQL客户端或命令行窗口,打开两个MySQL连接<