当用户注册我们的服务时,我想从许多中分配一个 solr 核心(资源的种类)。一个核心专供一位用户使用(例如!)。而且我想用来select ...for update
确保并发注册看到(和使用)不同的行。
东西适用于第一次注册交易;我们得到允许使用的行。但是对于第二个(向前),Lock wait timeout exceeded
发生了;当我想要下一行时。
为什么 MySQL 会抛出这个错误?
从 1 号航站楼:
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)
在 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)
其实我想看看:
mysql> select * from SolrCoresPreallocated order by id limit 1 for update;
+----+-------------+-----+-----+
| id | used_status | sid | cid |
+----+-------------+-----+-----+
| 2 | 0 | 0 | 401 |
+----+-------------+-----+-----+
1 row in set (0.00 sec)
我的数据是:
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)
我在中描述了我的问题:不同的交易必须保证选择不同的项目;避免争吵