Transactions 餐厅哲学家,innodb,选择更新

Transactions 餐厅哲学家,innodb,选择更新,transactions,innodb,deadlock,isolation-level,Transactions,Innodb,Deadlock,Isolation Level,将问题应用于innodb,并使用select进行更新: 1) 具有100000个fork的表,由具有单个主键(fork)的innodb表表示 2) fork的grab是一个select for update,它指定了这个表中2到20个主键之间的一些随机列表,而“grab”正好是这个随机fork列表上相对于100000个不同主键的一个select for update。顺便说一下,select语句中键列表的顺序是随机的 3) 有5个以上的思考者,比如说多达50个“同时”交易抓住了交叉叉 4) 思考

将问题应用于innodb,并使用select进行更新:

1) 具有100000个fork的表,由具有单个主键(fork)的innodb表表示

2) fork的grab是一个select for update,它指定了这个表中2到20个主键之间的一些随机列表,而“grab”正好是这个随机fork列表上相对于100000个不同主键的一个select for update。顺便说一下,select语句中键列表的顺序是随机的

3) 有5个以上的思考者,比如说多达50个“同时”交易抓住了交叉叉

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

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


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

我不知道“不公平”是什么意思,但是的,可能会出现死锁。例:两位思想家试图使用相同的叉子,比如1和2,但顺序相反。所以思考者一“拿”叉一,思考者二“拿”叉二。在那之后,两人都会“永远”地等待第二个叉子


您可以通过订购对货叉的访问权限轻松克服该问题。这样一来,第一个思考者将使用第一个叉子,第二个思考者必须等待第一个思考者完成,然后一切都会好起来。

这怎么可能?这两个思考者在一个select for update语句中指定了相同的两个分叉。mysql在select for update语句或任何真正的update语句中是否有一系列独立的写行锁,这些锁取决于列表中键的顺序?我没有注意到这只是一个select语句。但是,可以肯定的是,我会在select的末尾放一个“orderbyid”。否则,您无法确定innodb是否为您做到了这一点!