Chcę, aby równoległe transakcje wybierały wiersz z tabeli, oznaczając go jako "brudny", aby inne transakcje nie mogły go wybrać, a następnie wykonując resztę transakcja.Minimalny przykład użycia select ... do aktualizacji w celu odizolowania wierszy
Miałem problemy z wykorzystaniem select... for update
do tego celu, ponieważ druga transakcja dotyczy tego samego. Podaj minimalny przykład różnych transakcji, aby wybrać różne wiersze.
Moje dane to:
mysql> select * from SolrCoresPreallocated;
+----+-------------+-----+-----+
| id | used_status | sid | cid |
+----+-------------+-----+-----+
| 1 | 0 | 0 | 400 |
| 2 | 0 | 0 | 401 |
| 3 | 0 | 0 | 402 |
| 4 | 0 | 0 | 403 |
| 5 | 0 | 0 | 404 |
| 6 | 0 | 0 | 405 |
+----+-------------+-----+-----+
6 rows in set (0.00 sec)
I to rzeczy nie działa zgodnie z oczekiwaniami:
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from SolrCoresPreallocated order by id limit 1 for update;
+----+-------------+-----+-----+
| id | used_status | sid | cid |
+----+-------------+-----+-----+
| 1 | 0 | 0 | 400 |
+----+-------------+-----+-----+
1 row in set (0.00 sec)
...set the used_status to 1
...perform the rest of the operations
... jako drugi transakcji naprzód
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from SolrCoresPreallocated order by id limit 1 for update;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
Co dokładnie robi, czego się nie spodziewałeś? –
włączyło to również – aitchnyu