【问题标题】:MySQL select_for_update() and triggers .. how blocking works?MySQL select_for_update() 和触发器.. 阻塞是如何工作的?
【发布时间】:2017-05-13 13:37:07
【问题描述】:

我有一个整数值的行,该行上有很多并发请求,我希望每个读取操作后跟一个更新操作(增量),并保持数据一致,只有一个请求可以读取-> 同时更新。

我进行了一些研究并找出了 select_for_update(),并且我还想过在 SELECT 上触发以在选择它之后增加值,问题是..这会像我假设的那样工作吗?

触发器是并行工作还是以这种方式保持一致?

【问题讨论】:

    标签: mysql sql django database innodb


    【解决方案1】:

    django select_for_update 是大多数常见数据库(postgres、mysql、oracle...)中存在的 select ... for update 功能的包装器,它基本上锁定所选行以防止并发更新。

    PostgreSQL docs

    MySQL docs

    您需要将锁包装到事务中,以便访问将被锁定,直到事务执行结束。

    【讨论】:

    • 如果我使用 transcation.atomic() 打开一个事务,并在 transaction.atomic() 语句中使用 select_for_update(),行会被锁定到 transaction.atomic() 的最后一行) 阻止?
    • 是的,所有匹配的行都将被锁定,直到事务块结束。您可以通过在事务块中设置时间休眠来测试此行为,并在执行仍在块内时尝试更新行。
    猜你喜欢
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 2019-07-28
    • 2022-06-16
    • 2020-02-13
    • 1970-01-01
    • 2015-12-08
    相关资源
    最近更新 更多