之前线上有过一样的故障异常,后来排查是for循环事务导致的,故障现场精简后如下:
| T1 |
T2 |
| UPDATE test_table SET money = money + 1 WHERE user_id = 5 |
|
|
UPDATE test_table SET money = money + 1 WHERE user_id = 4 |
| UPDATE test_table SET money = money + 1 WHERE user_id = 1 |
|
|
UPDATE test_table SET money = money + 1 WHERE user_id = 2 |
| UPDATE test_table SET money = money + 1 WHERE user_id = 4 |
|
|
UPDATE test_table SET money = money + 1 WHERE user_id = 5 |
原业务逻辑是这样的:业务端会发送消息,该消息是个 list,里面存放 userId 和 money。消费端在接收的地方加了 @transaction 注解。在高峰情况下,会存在以上的场景,即某两个 userId 存在两个不同的消息中,并一起消费,互相死锁导致的异常。异常日志和 20.md 描述一致。
之前线上有过一样的故障异常,后来排查是for循环事务导致的,故障现场精简后如下:
原业务逻辑是这样的:业务端会发送消息,该消息是个 list,里面存放 userId 和 money。消费端在接收的地方加了 @transaction 注解。在高峰情况下,会存在以上的场景,即某两个 userId 存在两个不同的消息中,并一起消费,互相死锁导致的异常。异常日志和 20.md 描述一致。