我们在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