【问题标题】:Concurrency for select query in RedshiftRedshift中选择查询的并发性
【发布时间】: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


【解决方案1】:

你可以用你的方法 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

【讨论】:

    【解决方案2】:

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

    Transaction MySQL

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

    【讨论】:

    • 虽然这些链接可能会回答问题,但最好使用 stackoverflow 上的工具发布更多答案
    猜你喜欢
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多