【问题标题】:dining philosophers, innodb, select for update餐饮哲学家,innodb,选择更新
【发布时间】:2013-01-28 22:35:10
【问题描述】:

将哲学家就餐问题应用于innodb,以及select for update的使用:

1) 具有 100,000 个分支的表,由具有单个主键(分支)的 innodb 表表示

2) 分叉的抓取是一个更新选择,它指定了该表中 2 到 20 个主键的一些随机列表,而“抓取”正是这个随机分叉列表上相对于 100,000 的更新选择不同的主键。顺便说一下,select 语句中键列表的顺序是随机的。

3) 有超过 5 个思考者,比如说多达 50 个“同时”交易抓住相交的分叉

4) 思考时间是更新第 2 步中主键行的其他列。思考时间永远不会太长。

问题:对于innodb,在上述情况下是否可能由于不公平而导致死锁或饥饿?有什么需要注意的吗? (隔离级别读取已提交。)

目的:使用该表和锁定行的主键来表示复杂更新场景的依赖关系,以便在对各种相关表(顺序一致的表)和其中的行进行一系列更新之前,确定集合等同于步骤 1 的一组主键的依赖项,然后在事务开始时使用 select for update 锁定这些依赖项。 (当然,在选择更新之后,我重新查询依赖关系以确保它们没有改变。)

【问题讨论】:

    标签: transactions innodb deadlock isolation-level


    【解决方案1】:

    我不知道您所说的“不公平”是什么意思,但是是的,可能会出现僵局。示例:两个思考者尝试使用相同的叉子,例如 1 和 2,但顺序相反。所以思想家一“拿”叉子一,思想家二拿叉子二。之后,两者都会“永远”等待第二次分叉......

    您可以通过订购分叉的访问权限来轻松解决这个问题。这样第一个思考者会拿叉子,第二个必须等待第一个思考者完成,一切都很好。

    【讨论】:

    • 这怎么可能? 2 位思考者在一个 select for update 语句中执行此操作,该语句指定了相同的 2 个分叉。 mysql 在 select for update 语句或任何真正的更新语句中是否有一系列单独的写入行锁,这些锁取决于列表中键的顺序?
    • 我错过了它只有一个选择。但是,可以肯定的是,我会在选择的末尾放置一个“order by id”。否则你不能确定 innodb 会为你做到这一点!
    猜你喜欢
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    相关资源
    最近更新 更多