Files
mostlymatter/store/sqlstore
Agniva De Sarker 23dd4a5946 MM-31396: Fix a possible deadlock with SidebarCategories (#17109)
This is a deadlock due to reversed locking order of the SidebarChannels
and SidebarCategories table.

I could not find the exact culprit query from the deadlock output
because it only shows the last query a transaction is running. And from looking
at the code, the only query that runs "UPDATE SidebarCategories SET DisplayName = ?, Sorting = ? WHERE Id = ?"
is UpdateSidebarCategories. But for the deadlock to happen, it has to lock
SidebarChannels _first_, and then _then_ lock SidebarCategories.

Looking a bit more throughly, I found that DeleteSidebarCategory does indeed
lock the tables in an inverse way and if DeleteSidebarCategory runs concurrently with
UpdateSidebarCategories, they will deadlock.

Here's how it will happen.

```
tx1
DELETE FROM SidebarChannels WHERE CategoryId = 'xx';

tx2
UPDATE SidebarCategories SET DisplayName='dn' WHERE Id='xx';

tx2
DELETE FROM SidebarChannels WHERE (ChannelId IN ('yy') AND CategoryId = 'xx');

tx1
DELETE FROM SidebarCategories WHERE Id = 'xx';
```

And then we see:
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

To fix this, we simply reorder the Delete query to lock the SidebarCategories first,
and then SidebarChannels.

In fact, any transaction updating/deleting rows from those two tables should always operate on that order
if possible.

https://mattermost.atlassian.net/browse/MM-31396

```release-note
Fixed a database deadlock that can happen if a sidebar category is updated and deleted at the same time.
```
2021-03-16 15:07:30 +05:30
..
2021-01-07 22:42:43 +05:30
2021-01-07 22:42:43 +05:30
2021-03-05 09:18:37 +01:00
2021-01-07 22:42:43 +05:30
2021-01-07 22:42:43 +05:30
2021-01-07 22:42:43 +05:30
2021-03-05 09:18:37 +01:00
2021-01-07 22:42:43 +05:30
2021-01-07 22:42:43 +05:30
2021-03-12 12:37:30 -05:00
2021-01-07 22:42:43 +05:30
2021-01-07 22:42:43 +05:30
2021-01-07 22:42:43 +05:30
2021-03-15 18:33:54 +05:30
2021-01-07 22:42:43 +05:30
2021-03-05 09:18:37 +01:00