红移中选择查询的并发性



我们在Redshift中有一个表:

people_id    people_tele      people_email        role
1            8989898332       john@gmail.com      manager
2            8989898333       steve@gmail.com     manager
3            8989898334       andrew@gmail.com    manager
4            8989898335       george@gmail.com    manager

我有几个用户会查询表,例如:

select * from people where role = 'manager' limit 1;

系统用户基本上是打电话给这些人进行追加销售产品。因此,当查询返回结果时,它不应该返回相同的人。

例如。

如果用户 A 执行查询 -select * from people where role = 'manager' limit 1;,那么他应该得到结果:

people_id    people_tele      people_email        role
1            8989898332       john@gmail.com      manager

如果用户 B 执行查询 -select * from people where role = 'manager' limit 1;,那么他应该得到结果:

people_id    people_tele      people_email        role
2            8989898333       steve@gmail.com     manager

方法1

因此,我想添加一个is_processed列以不返回相同的结果。因此,在用户 A 执行查询后,该表将如下所示:

people_id    people_tele      people_email        role         is_processed
1            8989898332       john@gmail.com      manager      1
2            8989898333       steve@gmail.com     manager      0
3            8989898334       andrew@gmail.com    manager      0
4            8989898335       george@gmail.com    manager      0

方法2

另一个想法是创建另一个名为 -query_history的表,我有:

query_id   people_id     processed_time
1          1             22 Jan 2020, 4pm
2          2             22 Jan 2020, 5pm

问题

我的问题是,当用户 A 和用户 B 同时查询时会发生什么?此时系统将返回相同的people_id,并且将向同一个人拨打 2 个电话。

如何解决并发问题?

您只能使用方法 1 解决它,只需在其中添加随机化器

SELECT * FROM people 
WHERE role = 'manager' 
AND is_processed = 0
order by random()
limit 1;

参考: https://docs.aws.amazon.com/redshift/latest/dg/r_RANDOM.html

也许你可以用交易来解决? 尝试一些尝试/捕获操作。

事务 MySQL

编辑:抱歉,出于某种原因,我认为您正在使用MySQL。 https://docs.aws.amazon.com/redshift/latest/dg/stored-procedure-transaction-management.html

最新更新