SQL:Select 先更新 - 对于并发用户
SQL: Select first and update - for concurrent users
长话短说;博士:
我希望我的数据库中有一个 table 作为优先队列(这里是 ID
上的最小队列),是否有任何免费(用于商业用途)的 DBMS 可以解决我的问题?查询会是什么样子?
我想让许多并发用户从 table 到 select 一行,例如我有 table
+------+-------+--------+------------+
| ID | Col 1 | Col 2 | Processed |
+------+-------+--------+------------+
| 1000 | data | data | False |
+------+-------+--------+------------+
| 1001 | data | data | False |
+------+-------+--------+------------+
| 1002 | data | data | False |
+------+-------+--------+------------+
如果我有 3 个用户,我想做原子 SELECT
和 UPDATE
,这样第一个查询 returns Col 1
和 Col 2
从具有最低 ID
的行开始并将 Processed
标记为 True
,以便下一个查询将 return 具有 ID = 1001
.[=22 的行=]
table预计会很小,即最多 100,000 行,预计队列将在大约 8 小时内清空(大约每秒 3-4 次查询,峰值可能在 50 次查询左右)一秒钟)。我习惯了PostgreSQL/MySQL,也用过MongoDB。
我应该如何设计我的系统来应对这种情况?查询会是什么样子? table 锁会很明显吗?
我认为 PostgreSQL
应该是一个很好的人选。
一些有趣的提示:
除非我遗漏了什么,否则每个线程都会执行 SELECT FOR UPDATE
(使用 SKIP ROW LOCKED
)以便它选择第一个非锁定行并为其他所有人锁定它,处理它并标记它/完成后将其删除。
长话短说;博士:
我希望我的数据库中有一个 table 作为优先队列(这里是 ID
上的最小队列),是否有任何免费(用于商业用途)的 DBMS 可以解决我的问题?查询会是什么样子?
我想让许多并发用户从 table 到 select 一行,例如我有 table
+------+-------+--------+------------+
| ID | Col 1 | Col 2 | Processed |
+------+-------+--------+------------+
| 1000 | data | data | False |
+------+-------+--------+------------+
| 1001 | data | data | False |
+------+-------+--------+------------+
| 1002 | data | data | False |
+------+-------+--------+------------+
如果我有 3 个用户,我想做原子 SELECT
和 UPDATE
,这样第一个查询 returns Col 1
和 Col 2
从具有最低 ID
的行开始并将 Processed
标记为 True
,以便下一个查询将 return 具有 ID = 1001
.[=22 的行=]
table预计会很小,即最多 100,000 行,预计队列将在大约 8 小时内清空(大约每秒 3-4 次查询,峰值可能在 50 次查询左右)一秒钟)。我习惯了PostgreSQL/MySQL,也用过MongoDB。
我应该如何设计我的系统来应对这种情况?查询会是什么样子? table 锁会很明显吗?
我认为 PostgreSQL
应该是一个很好的人选。
一些有趣的提示:
除非我遗漏了什么,否则每个线程都会执行 SELECT FOR UPDATE
(使用 SKIP ROW LOCKED
)以便它选择第一个非锁定行并为其他所有人锁定它,处理它并标记它/完成后将其删除。