【发布时间】:2020-01-20 15:23:36
【问题描述】:
我们在 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 个电话。
如何解决并发问题?
【问题讨论】:
-
会发生什么取决于您如何实施对
is_processed列的更新。 -
@GordonLinoff - 实现这一点的最佳方法是什么,这样并发问题就不存在了?
-
。 .每次要获取值时锁定整个表。但是,这在高事务环境中可能不可行。
-
如何锁表?还有其他方法吗?
-
您可以存储分配记录的用户的名称,而不是将
0/1存储在is_processed中。如果存在竞争条件,则以后的更新将获胜。没关系,因为它不会显示早期用户的名称。顺便说一句,Amazon Redshift 被设计成一个数据仓库,而不是一个事务处理数据库。对记录进行如此小的更新会影响表的存储和查询效率。
标签: sql concurrency amazon-redshift