更新:MysqlとPostgresSKIP LOCKED
があります。NOWAIT
古い質問が続きます。
並行トランザクションでテーブルから行を選択し、他のトランザクションが選択できないように「ダーティ」としてマークしてから、残りのトランザクションを実行するようにします。
select... for update
2番目のトランザクションが同じことを主張しているため、この目的で使用するのに問題がありました。個別の行を選択するためのさまざまなトランザクションの最小限の例を提供してください。
私のデータは次のとおりです。
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)
そして、このようなものは期待どおりに機能していません:
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
...2番目以降のトランザクションとして
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)